前面我们学习了垃圾回收机制,知道当一个值失去引用之后,就会被标记,并会垃圾回收机制回收释放空间。
我们还知道当一个函数的执行上下文运行完毕之后,内部的所有内容都会失去引用而被垃圾回收机制所回收。
但是我们又知道,闭包的本质就是在函数外部保持了内部变量的引用,因此闭包会阻止垃圾回收机制的回收过程。
我们可以用下面这个例子来证明这一点。
function f1() {
var n = 999;
nAdd = function() {
n += 1;
}
return function f2() {
console.log(n);
}
}
var result = f1();
result(); // 999
nAdd();
result(); // 1000
在上面的例子可以看出,nAdd、f2
都因为访问了f1中的n,因此他们都与f1形成了闭包。这个时候变量n的引用被保留了下来。因此f2(result)与nAdd执行时都访问了n,而nAdd每运行一次就会将n加1。所以上例的执行结果非常符合我们的认知。
认识到闭包中保存的内容不会被释放之后,我们在使用闭包时就要保持足够的警惕性。如果滥用闭包,很可能会因为内存的原因导致程序性能过差。