1、什么是闭包
闭包就是能够读取其他函数内部变量的函数;
我们来看一段代码示例:
function outer() {
var n = 0;
return function inner() {
n=n+1;
return n;
}
}
var fn = outer();
fn(); //=>1
fn(); //=>2
2、闭包代码解析
我们把1中的代码修改来看
function outer() {
var n = 0;
n = n+1;
return n;
}
outer(); //=>1
outer(); //=>1
可以看到像上边这样调用,两次都是返回1,说明每次代码都是重新走一遍,n=0,然后返回n+1
我们再来分析分析1中的代码
outer()执行,返回inner函数的堆内存地址,这个地址有保存在整个代码的执行环境中(栈),所以outer函数执行开辟的栈内存不会被销毁,n保存在outer的栈内存中,n的值得以保存。因为闭包的大量使用比较占用内存,所以要谨慎使用,也可以主动释放内存,1中的代码,要释放被占用的内存,可以用 fn = null;
3、使用闭包的注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。