内层函数能够访问到外层函数的作用域
应用:实现数据的私有
简单理解:闭包=内层函数+引用的外层函数变量
function outer(){
let a = 10 //外部使用a变量
function fn(){
console.log(a)
}
}
外部如果想使用闭包的变量,则此时需要return
let count = 1
function fn(){
count++
console.log(`函数被调用${count}次`)
}
fn() //"函数被调用2次"
fn() //"函数被调用3次"
count = 1000
fn() //"函数被调用1001次"
//count是全局变量容易被修改
function fn(){
let count = 1
function fun(){
count++
console.log(`函数被调用${count}次`)
}
return fun
}
const result = fn()
result() //调用的是返回的fun函数 "函数被调用2次"
result() //调用的是返回的fun函数 "函数被调用3次"
count = 1000
result() // "函数被调用4次"
//count是私有数据,无法被修改
上述代码,谁会存在内存泄露?count变量
借助于垃圾回收机制的标记清除法可以看出:
①result是一个全局变量,代码执行完毕不会立即销毁
②result是用fn函数
③fn用到fun函数
④fun函数里面用到count
⑤count被引用就不会被回收,所以一直存在
此时,闭包引起了内存泄漏