什么是闭包
SO上的解释:点击打开链接
我的理解,简单的想就是:由于内部函数被外部函数的一个变量引用时,而这个内部函数也要被外部函数引用,就产生了一个闭包环境。
闭包的用处
刚开始看到闭包十分费解.
它的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
function a() {
var i = 0;
function b() { alert("i:"+(++i)); }
return b;//这里不能返回b() 否则会出现c is not a function
}
var c = a();
c();//i:1
c();//i:2
c();//i:3
c();//i:4
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
这个变量一直在内存中保存。
闭包的应用
闭包的另一个重要用途是实现面向对象中的对象,传统的对象语言都提供类的模板机制,这样不同的对象(类的实例)拥有独立的成员及状态,互不干涉。
虽然JavaScript中没有类这样的机制,但是通过使用闭包,我们可以模拟出这样的机制。
function Person(){
var name = "default";
return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
}
}
};
var john = Person();
console.log(john.getName()); //default
john.setName("john");
<pre name="code" class="javascript">console.log(john.getName()); //john
var jack = Person();
<pre name="code" class="javascript"><pre name="code" class="javascript">console.log(jack.getName()); //default
jack.setName("jack");
<pre name="code" class="javascript"><pre name="code" class="javascript">console.log(jack.getName()); //jack
闭包的释放
由于为了保证引用,变量,参数会一直保存在内存中,直到闭包环境的引用被释放,闭包也就释放了。
john=null;//释放引用
jack=null;//释放引用
闭包的底层
这是某位大神的总结点击打开链接
看的我云里雾里,最后耐心的研究了下,用自己的话来简述下原理吧
首先,由于js的GC一般会回收被占用的资源,正常情况下,a在返回后,就执行结束了。但是闭包的情况比较特殊,他返回的是一个内部函数的引用,而这个内部函数又调用了外部函数a的变量,于是a的引用不被回收,那么GC就会一直为当前的引用保留着这个变量。
其次,函数的作用域在定义这个函数的时候就已经确定了。
“a返回函数b的引用给c,又函数b的作用域链包含了对函数a的活动对象的引用,也就是说b可以访问到a中定义的所有变量和函数。函数b被c引用,函数b又依赖函数a,因此函数a在返回后不会被GC回收。”这句话特别难理解,我也不是很吃透,毕竟对js的底层不是很熟悉。