【问题标题】:JS - Garbage collected closure?JS - 垃圾收集关闭?
【发布时间】:2015-01-08 14:07:50
【问题描述】:

各位程序员大家好!
我的整个代码基于以下结构:

function pseudoClass() {  
    var privateVar = 0;

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

}

var test1 = pseudoClass();

我想在能够操纵它的同时保护“privateVar”。 “pseudoClass”一次只会被实例化一次。我相信“测试”涉及关闭。当我完成“test”后,我可能会稍后创建“test2”以重新开始(privateVar 再次设置为 0)。我对仅仅将“测试”重置为 0 不感兴趣。

现在,问题来了。当不再使用“测试”时,闭包会发生什么?是垃圾收集还是会导致内存泄漏?如果不是,它会在哪种类似的情况下这样做?我希望我的问题足够清楚,我对这些东西很陌生。谢谢!

【问题讨论】:

    标签: javascript garbage-collection closures


    【解决方案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
    

    【讨论】:

    • 非常感谢!您的回答非常有用。您是否还有关于此类主题的文档?
    猜你喜欢
    • 1970-01-01
    • 2016-11-18
    • 2010-09-10
    • 2011-05-27
    • 2015-06-10
    • 2020-03-01
    • 2011-01-21
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多