前面我们学习了垃圾回收机制,知道当一个值失去引用之后,就会被标记,并会垃圾回收机制回收释放空间。

我们还知道当一个函数的执行上下文运行完毕之后,内部的所有内容都会失去引用而被垃圾回收机制所回收。

但是我们又知道,闭包的本质就是在函数外部保持了内部变量的引用,因此闭包会阻止垃圾回收机制的回收过程。

我们可以用下面这个例子来证明这一点。

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。所以上例的执行结果非常符合我们的认知。

认识到闭包中保存的内容不会被释放之后,我们在使用闭包时就要保持足够的警惕性。如果滥用闭包,很可能会因为内存的原因导致程序性能过差。

results matching ""

    No results matching ""