首页 > 代码库 > 关于闭包

关于闭包

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; //是对象为空
};

关于闭包