在闭包中使用 'self' 会导致内存泄漏吗?

Could using 'self' inside a closure lead to a memory leak?

如果我在一个对象中有一个函数(在我的例子中是一个 Backbone 模型)...

doIt: function () {
    var self = this,  
        result = null;

    this.doMagic(function(){
        result = self.doWizardry();
    });    

    self = null;

    return result
}

...我是否需要像我在此处所做的那样将 self 设置为 null,以避免内存泄漏?

额外的问题,闭包对 'result' 的引用也会导致内存泄漏吗?

任何关于提高此类结构效率的建议都将不胜感激!

(希望这不是一个真正的函数,只是说明性的)

谢谢!

没有。事实上,在调用 this.doMamgic() 之前将 self 设置为 null 也会破坏变量 self,这样 this.doMagic() 将无法使用它,因为它当 this.doMagic() 稍后实际尝试使用它时,该值将被清除。

Javascript 中的自引用本身不会导致内存泄漏。 GC 足够聪明,可以检测到这一点。如果整个对象是其他JS无法访问的,那么对象内部有多少对自身的引用都没有关系。

我在这段代码中没有看到为什么使用变量 self 会导致内存泄漏的特别原因,并且做这样的事情是一个用于存储回调可以使用的状态的公认模式(就像你正在尝试做)。


至于一般建议,doIt() 函数的要点看起来有问题。您似乎正在尝试 return this.doMagic() 设置的 result 值,但是 this.doMagic()doIt() 执行时未被调用,因此 resultdoIt() returns.

时永远不会有值

因此,整个结构似乎存在缺陷。要知道要推荐什么,需要了解您要完成的工作以及您如何 calling/using 您尚未公开的代码。