概念
闭包就是能够读取其他函数内部变量的函数。闭包就是将函数内部和函数外部连接起来的一座桥梁
作用
- 读取函数内部变量
- 在内存中保存变量:
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
f1是f2的父函数,而f2的存在依赖于f1
f2被赋给了全局变量,这导致f2始终在内存中,因此f1也始终在内存中,所以变量n一直保存着
而 nAdd()也是全局变量,因为前无var限制。其实它也是闭包,可以在函数外部对函数内部的局部变量进行操作。
所以:
var result=f1();
result(); // 999
nAdd();
result(); // 1000
- 实现公有,私有,特权变量:
var foo = ( function() {
var secret = 'secret';
return {
get_secret: function () {
// 通过定义的接口来访问 secret
return secret;
},
new_secret: function ( new_secret ) {
// 通过定义的接口来修改 secret
secret = new_secret;
}
};
} () );
foo.secret就会报错不能访问这个私有变量
但是闭包可以访问:
foo.get_secret (); // 得到 'secret'
foo.new_secret ('a new secret'); // 通过函数接口,我们访问并修改了 secret 变量
foo.get_secret (); // 得到 'a new secret'
缺点及解决方法
变量的值都保存到内存中,会导致页面加载时内存消耗很大,IE会导致内存泄露
解决方法: 退出函数之前,将不使用的局部变量全部删除
例如: 将element解除引用 test = element.id
function closure() {
var element = document.getElementById('someElement');
var test = element.id
element.onclick = function(){
alert(test)
}
element = null
}