一、什么是闭包:
简单的说:父函数,包着子函数。子函数可以引用父函数的参数和变量,参数和变量不会被垃圾回收所收回,看下面的例子。
function a(cc){
var aa = 5;
function b(){
alert(cc)
alert(aa)
}
b()
}
a(3)
二、用闭包有什么好处:
可以让一个变量长期存在于内存中,例如
function aaa(){
var a = 5;
function bbb(){
alert(a)
}
return bbb;
}
var c = aaa();//aaa函数已经执行完毕,
c()
避免全局变量的污染,例如:
function aaa(){
var a = 1;
return function(){
a++
alert(a)
}
}
var b = aaa();
b();
b()
可以有,私有成员(私有方法)的存在,例如:
var aaa = (function(){
var a = 1;
function bbb(){
a++
alert(a)
}
function ddd(){
a++
alert(a)
}
return {
b:bbb,
d:ddd
}
})()
aaa.b();
aaa.c()
三、闭包有什么用处
模块化代码,减少全局变量的污染,例如:
var aaa = (function(){
var a = 1;
return function(){
a++
alert(a)
}
})()
aaa();
aaa()
在循环中直接找到对应元素的索引,例(有多个li)
var lis = document.getElementsByTagName("li");
for (var i = 0; i <lis.length; i++) {
(function(i){
lis[i].onclick = function(){
alert(i);
};
})(i)
};
在循环中直接找到对应元素的索引,另一种写法,用return;
for (var i = 0; i <lis.length; i++) {
lis[i].onclick = (function(i){
return function(){
alert(i);
}
})(i);
};
四、闭包需要注意的什么
IE会引发内存泄露:
内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束,使CPU不断增加。
例如:
//满足IE内存泄露的条件,一个变量获取dom节点,他的一个属性比如onclick去引用一个内部函数,而这个内部函数变量又去引用外部这个对象。这样就会存在内存泄露。
window.onload = function(){
var Odiv = document.getElementById("div");
Odiv.onclick = function(){
alert(Odiv.id)
}
}
/*解决办法*/
window.onunload = function(){
Odiv.onclick = null;
}