js中对闭包的理解

时间:2022-05-09 22:44:53

先上例1代码:

function f1(){
    var n=99;
    nAdd =function(){n+=1;};
    function f2(){
        console.log(n);
    }
    return f2;
}
var result = f1();
result();   // => 99
nAdd();
result();   // => 100

在这里result就是闭包f2的函数。它一共运行了两次,第一次值是99,第二次值是100。

这证明了函数f1中的局部变量一直保存在内存中,并没有在调用f1后被自动清除。

原因就在于f1是f2的父函数,而f2被赋值给了全局变量,这导致f2始终在内存中,而f2

的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制回收。

应注意的是,nAdd=function(){n+=1} 这行,首先在nAdd前面没有使用var关键字,

因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是个匿名函数,匿名

函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的

局部变量进行操作。

例2:

function constfunc() {
    var funcs = [];
    for (var i = 0; i < 10; i++)
        funcs[i] = function () {
            return i;
        };
    return funcs;
}

这里我们可以看成返回一个函数数组,每个数组元素都是一个闭包,它们共用一个变量i。

当循环结束后,共用变量i已经变为10,当调用数组中的函数时,会从内存中去寻找变量i,

然后返回10。每个匿名函数都返回10。