闭包:函数的AO通过scope chain 相互连接起来,使得函数体内的变量都可以保存在函数的AO,这样的特性称为“闭包”。
闭包的产生:当一个嵌套的内部(子)函数 引用了 外部函数 的 变量或函数 时就产生了闭包
闭包的危险:
函数执行完后,函数内的局部变量没有释放,占用内存时间会变长
会造成原有AO不释放,产生内存泄漏
解决方法
及时释放:f=null 让内部函数成为垃圾对象
闭包的应用:
实现公有变量
缓存存储结构
封装,实现属性私有化
模块化开发
1.使用函数内部的变量在函数执行完后,任然存活在内存中(延长了局部变量的生命周期)
2.让函数外部可以操作 到 函数内部的数据(变量/函数)
问题:函数执行完后,函数内部声明的局部变量是否还存在?
一般不存在,存在于闭包中的变量才可能存在
在函数外部能直接访问函数内部的局部变量?
不能,可以通过闭包操作数据
例:
function fn1(){
//私有数据
var a=2;
function fn2(){
a++;
console.log(a);
}
//向外暴露的函数
return fn2;
}
var f = fn1();
f(); //3
f(); //4