首页 > 代码库 > 关于闭包
关于闭包
1、《高级程序设计》上,这样说:当在函数内部定义了其他函数时候,就创建了闭包。闭包有权访问包含函数内部的所有变量。也就是
函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制所收回。 |
这个引用才是关键,因为这个引用的存在,外部函数成了这个引用运行的上下文,迫使垃圾回收机制GC不能回收这条链上所占用的资源。而如果没有这个引用,则跟一般函数一样,函数运行完资源就会被回收。我看了作用域链的概念,感觉看懂了作用域链,再来理解闭包就简单地多。闭包实质是内存中开辟一块地址,用于保存上下文。在另一个函数内部定义的函数会将包含函数(即外部函数)的活动对象添加到它的作用域链中。闭包函数调用的外部函数变量都是引用,因此当执行类似于a[i]=function(){return i;}这种不能立即执行的出结果给数组赋值时候,就会出现问题。解决办法就是使用匿名函数进行立即执行出结果。这样函数参数按值传递,相当于在这个内部函数中又创建并返回了一个闭包,每个函数都有自己的参数,可以返回各自的值。
另外关于this,由于匿名函数执行环境具有全局性,this通常指向window。每个函数在被调用时候,会自动取得两个变量:this arguments。闭包函数只会搜索到自身活动对象上,不可能直接访问外部函数中的这两个变量。因此
var name="haha"
var object={
name:"hehe";
getName:function(){return function(){this.name;}}//这里的this指向window
};
object.getName()();//haha
2、闭包有什么好处呢
1)希望一个变量长期驻扎在内存中
2)可以避免全局变量的污染
3、闭包需要注意的地方
闭包在ie阅览器下很容易引发内存泄漏。页面跳转的时候,变量不进行释放,一直存在内存中,使得cpu累加提高,只有关闭浏览器的时候才会释放。
window.onload = function(){ |
var oDiv = document.getElementById(‘div1‘); |
//一个对象属性引用一个内部函数,而这个内部函数又去引用外部对象,就会出现内存泄漏问题 |
oDiv.onclick = function(){ |
alert(oDiv.id); |
}; |
//解决办法 |
window.onunload = function(){ |
oDiv.onclick = null; |
}; |
}; |
另一种做法: |
window.onload = function(){ |
var oDiv = document.getElementById(‘div1‘); |
var id = oDiv.id; //提前建立变量 |
oDiv.onclick = function(){ |
alert(id); |
}; |
oDiv = null; //是对象为空 |
}; |
关于闭包