这是我参与「第四届青训营 」笔记创作活动的第5天
闭包
如何产生闭包:当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时, 就产生了闭包
闭包是什么:①闭包是嵌套的内部函数②包含被引用变量(函数)的对象
产生闭包的条件:
- 函数嵌套
- 内部函数引用了外部函数的数据(变量/函数)
注意: 闭包存在于嵌套的内部函数中
闭包的作用:
-
使用函数内部的变量。让变量在函数执行完后, 仍然存活在内存中(延长了局部变量的生命周期)
-
让函数外部可以操作到函数内部的数据
定义JS模块,将所有的数据和功能都封装在一个函数内部(私有的),只向外暴露一个包含n个方法的对象或函数,模块的使用者, 只需要通过模块暴露的对象调用方法来实现对应的功能
闭包的生命周期:
- 产生: 在嵌套内部函数定义执行完时就产生了(不是在调用)
- 死亡: 在嵌套的内部函数成为垃圾对象时
function fn1() {
//此时闭包就已经产生了(函数提升, 内部函数对象已经创建了)
var a = 2
function fn2 () {
a++
console.log(a)
}
return fn2
}
var f = fn1()
f() // 3
f() // 4
f = null //闭包死亡(包含闭包的函数对象成为垃圾对象)
闭包的缺点与解决:
缺点:函数执行完后, 函数内的局部变量没有释放, 占用内存时间会变长,容易造成内存泄露
解决:能不用闭包就不用、及时释放。MDN:如果不是某些特定任务需要使用闭包,在其它函数中创建函数是不明智的,因为闭包在处理速度和内存消耗方面对脚本性能具有负面影响