了解闭包前,先了解变量:局部变量和全局变量。
var m = 100;
function f1(){
console.log(m);
}
f1() // 100
//m为全局变量
function f2(){
var n = 100;
}
f2();
console.log(n); //Uncaught ReferenceError: n is not defined
//n为局部变量
// ps:如果在函数里面,没有用var,实际上是定义了一个全局变量。如下:
function f3(){
j = 100;
}
f3();
console.log(j); //100
//j为全局变量
接下来的问题是,如何从外部获取局部变量:
function f4(){
var k = 100;
function f5(){
alert(k);
}
return f5;
}
f4()() //100
如上,f5可以读取f4中的局部变量,那么只要把f5作为返回值,我们就可以在f4外部读取它的内部变量(k)。f5就是闭包。
闭包的用途 :
闭包可以用在许多地方。它的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
使用闭包的注意点:
1.由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露(内存泄漏是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。)。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2.闭包会在父函数外部,改变父函数内部变量的值。
注意:
闭包并不会引起内存泄漏,只是由于IE9之前的版本对JScript对象和COM对象使用不同的垃圾收集,从而导致内存无法进行回收,这是IE的问题,所以闭包和内存泄漏没半毛钱关系。具体看这篇文章