您的位置:首页 > 其它

闭包

2015-04-19 10:20 155 查看

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);//报错
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: