闭包
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);//报错
相关文章推荐
- 学习Javascript闭包(Closure)
- (作业)Swift闭包、扩展、泛型
- 关于闭包
- 作用域闭包
- python的闭包
- 深入理解javascript原型和闭包(14)——从【自由变量】到【作用域链】
- Swift 闭包(Closure)回调传值
- js闭包的用途详解
- 使用闭包构建模块
- 【转载】为什么说Java匿名内部类是残缺的闭包
- 闭包概念
- 闭包
- Swift-闭包简单使用
- 什么是闭包?
- POJ 2594--Treasure Exploration【二分图 && 最小路径覆盖 && 点可以重复走 && 传递闭包】
- Python中的闭包
- Groovy的闭包
- (POJ 3660)Cow Contest [详解] [floyd] 传递闭包 确定top序列顺序
- javascript深入理解js闭包
- 深入理解javascript原型和闭包