1、何为有效闭包?
有效闭包
如果将内部函数return出去,那么该闭包就会被长久保留,就是有效闭包
2、何为无效闭包?
无效闭包
即使没有讲内部函数return出去,只要满足以上的所有产生条件,
那么就会产生闭包,只是这个闭包只会存活极短的时间,就是无效闭包
function wrap(){
var a = 1;
function moon(){
console.log('a',a)
}
// console.log('moon',moon)
return moon;
}
var result = wrap();
3.闭包的优点(用处)
1.延长了变量的生命周期
本来外层函数执行结束的时候,外层函数的执行上下文应该要被销毁,
连带着里面的所有变量都要销毁,但是最终变量被闭包成功保留,没有被销毁
2.可以实现js模块化
使用闭包将某些数据缓存起来,变为私有数据,其他人无法修改
例如:JQuery
4.闭包的缺点(副作用)
1.将本该销毁的变量保存下来,需要花费更多的内存
内存泄漏 花费了更多的内存空间来实现功能 (口袋有10块钱,本来买东西要花1块,结果花了2块)
内存溢出 由于内存泄漏过多,最终超出了当前电脑内存所能存储的极限(存满了)
结果就是程序宕机,无法正常使用当前项目 (本来有10块钱,买一样东西结果要11块)
5.如何解决闭包的副作用
1.尽量减少使用闭包
2.将无用的闭包及时释放
问题:为什么闭包不会被销毁
原因:因为内部函数使用Scopes属性引用着闭包,而内部函数又被外部的变量引用着,而垃圾回收机制只会回收没人引用的东西
解决:将外部对内部函数的引用释放掉即可 result=null
如果同时有多个内部函数共享一个闭包对象,那么必须将使用到的内部函数全部释放销毁,
否则闭包将永久存活