先上例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。