要理解javascript的闭包,首先要理解javascript的变量的作用域。变量的作用域就两种,全局变量和局部变量。
在javascript中内部函数可以读取全局变量,而外部函数不能读取内部变量。但是我们有时候又不要在外部读取函数内部的变量,那么需要怎么做呢。这是就可以在函数内部再定义一个函数,
function f1(){
var n=999;
function f2(){
alert(n); // 999
}
}
f2对f1可见,但是反过来f1对f2不可见。这就是javascript中链式作用域。chain scope,子对象会一级一级往上寻找父对象的变量,那么我们现在把f2作为返回值就能在f1外部得到它的内部变量了。
闭包就是能读取到其他函数内部变量的函数。也可以理解为定义在一个函数内部的函数。
在本质上就可以理解为内部函数和外部函数沟通的桥梁。
闭包的另一个作用呢,就是让变量的值始终保持在内存中。
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
这里result就是闭包函数。首先要知道javascript的GC机制,如果一个对象不再被引用,那么这个对象就会被GC回收,为什么结果是这样的呢,因为f1是f2的父函数。f2被赋值给一个全局变量,所以f2始终在内存中,f1也是一直在内存中。使用闭包的注意:
1.闭包会使函数的变量都保存在内存中,所有内存消耗很大,不能滥用闭包,在ie中可能造成内存泄漏,解决办法是在结束的时候,将不适用的全局变量删除。
2.不要随意在外部改变函数内部的值
来源: http://lib.csdn.net/article/javascript/38035