大家好,各位程序员!
我的整个代码基于以下结构:
函数pseudoClass() { var privateVar = 0;返回{ incrementVar: function() {privateVar += 1;};},getPrivateVar: function() {返回privateVar;} } test1 = pseudoClass();
我想保护"privateVar“,同时能够操纵它。"pseudoClass“一次只实例化一次。我认为“测试”涉及到一个终结。当我完成了“测试”之后,我可能会在稍后创建"test2“来重新开始(privateVar又被设置为0)。我不感兴趣的只是将“测试”重新设置为0。
现在,这是一个问题。当不再使用"test“时,闭包会发生什么情况?是垃圾收集的,还是会导致内存泄漏?若否,又会在甚麽情况下这样做?我希望我的问题足够清楚,我对这件事很陌生。谢谢!
发布于 2015-01-08 14:22:40
有一种常见的误解,即闭包本身就会导致内存泄漏。它们不会--只要它们成为遥不可及,它们就可以像任何其他对象一样被垃圾收集。当它们被泄漏时,它们往往会导致问题,因为它们阻止了它们继承的父作用域被垃圾收集。这可以为闭包提供一个非常大的保留尺寸。
在您的示例中,当没有其他引用时,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 scopehttps://stackoverflow.com/questions/27842044
复制相似问题