闭包

来源:互联网 发布:企业管理平台软件 编辑:程序博客网 时间:2024/04/30 11:28

1.什么是闭包

函数嵌套函数。
内部函数可以引用外部函数的参数和变量。
参数和变量不会被垃圾回收机制所收回。

function aa(a){
      var b=5;   //a、b都不会被垃圾回收机制回收,因为bb()函数要引用
function bb(){
    alert(a);    //undefined
alert(b);   //5
}      
 return bb;
}
var c=aa();

c();


2.好处

1》可以长期的驻扎到内存中。

2》避免全局变量的污染,提高性能。

eg1:

var a=1;
function b(){
a++;
alert(a);
}
b();
b();

function b(){
var a=1;
a++;
alert(a);
}
b();
b();


eg2:

//函数形式
function aa(){
var a=1;
return function()
{    a++;
    alert(a);
}

}
var c=aa();
c();
c();
alert(a);//报错



//函数表达式的形式
var aa=(function (){
var a=1;
return function()
{    a++;
    alert(a);
}

}
)();
aa();
aa();

3》私有成员和私有函数存在。

eg3:

var aa=(function(){
 var a=1;
 function b(){
 alert(a);
 };
function c(){
a++;
alert(a);
}
return { 
dd:b,
ee:c
}
})();

aa.dd();
aa.ee();
alert(a);//报错,因为访问不到私有变量
alert(bbb);//报错,因为访问不到私有函数
alert(ccc);//报错


用法:

a.模块化代码:见上面的eg2,eg3.

b.在循环中找到对应的索引

法一:
<body>
<ul id="ul1">
<li>111</li>
    <li>222</li>
    <li>3333</li>
</ul>
<script>
var oUl=document.getElementById("ul1");
var aLi=oUl.getElementsByTagName("li");
for(var i=0;i<aLi.length;i++){
(function(i){
aLi[i].onclick=function(){
alert(i);
}
})(i);

}
</script>
</body>

法二:
<body>
<ul id="ul1">
<li>111</li>
    <li>222</li>
    <li>3333</li>
</ul>
<script>
var oUl=document.getElementById("ul1");
var aLi=oUl.getElementsByTagName("li");
for(var i=0;i<aLi.length;i++){
aLi[i].onclick=(function(i){
return function(i){
alert(i);
}
})(i);

}
</script>
</body>

3.闭包的问题

a.IE下的内存泄露问题(即变量内外互相引用,导致占有的内存得不到释放)

eg1:
window.onload=fuction(){
var oDiv = document.getElementById("div");
oDiv.onclick=function(){
alert(oDiv.id);
}
window.onunload=function(){
oDiv.onclick=null;
}


}

eg2:
window.onload=fuction(){
var oDiv = document.getElementById("div");
        var  id=oDiv.id
oDiv.onclick=function(){
alert(id);
};
oDiv=null;
}




var a=1;
function b(){
a++;
alert(a);
}
b();
b();


function b(){
var a=1;
a++;
alert(a);
}
b();
b();

function aa(){
var a=1;
return function()
{    a++;
    alert(a);
}

}
var c=aa();
c();
c();
alert(a);//报错

0 0
原创粉丝点击