JS - 垃圾收集封闭?

时间:2015-01-08 14:07:51

标签: javascript garbage-collection closures

Hello其他程序员! 我的整个代码基于以下结构:

function pseudoClass() {  
    var privateVar = 0;

    return {  
        incrementVar: function() {privateVar += 1;},
        getPrivateVar: function() {return privateVar;}
    }
     

}

     

var test1 = pseudoClass();

我想保护" privateVar"同时能够操纵它。 "伪类"只会一次实例化一次。我相信"测试"涉及封闭。当我完成" test"时,我可能会创建" test2"稍后重新开始(privateVar再次设置为0)。我对仅仅重置" test"不感兴趣。到了0.

现在,问题就在这里。当"测试"关闭时会发生什么?不再使用了?它是垃圾收集还是会导致内存泄漏?如果没有,它会出现类似的情况吗?我希望我的问题很清楚,我对这些东西很新。谢谢!

1 个答案:

答案 0 :(得分:1)

有一种常见的误解,即闭包固有地导致内存泄漏。他们没有 - 只要他们成为unreachable他们可以像任何其他对象一样被垃圾收集。当泄露时,它们往往会导致问题,因为它们会阻止其继承的父范围被垃圾收集。这可以使闭包非常大retained size

在您的示例中,pseudoClass返回的对象及其方法关闭的范围(包含privateVar)在没有其他引用的情况下符合GC的条件:

var test1 = pseudoClass();
test1 = null;

// The object, closures and privateVar can be garbage collected

如果对pseuedoClass 返回的对象或包含函数范围的任何闭包有另一个引用,则无法对对象和作用域进行垃圾回收。此模式是内存泄漏的常见原因。

var test1 = pseudoClass();
var leak = test1.incrementVar
test1 = null;

// Nothing can be garbage collected, since `incrementVar` needs to retain its parent scope