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

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

本文关键字:内存 泄漏 闭包 self      更新时间:2023-09-26

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

doIt: function () {
    var self = this,  
        result = null;
    this.doMagic(function(){
        result = self.doWizardry();
    });    
    self = null;
    return result
}

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

奖励问题,关闭对"结果"的引用也会导致内存泄漏吗?

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

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

谢谢!

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

Javascript中的自引用本身不会导致内存泄漏。 GC 足够智能,可以检测到这一点。 如果其他 JS 无法访问整个对象,则对象在对象中对自身有多少引用并不重要。

我在此代码中没有看到为什么使用变量 self 会导致内存泄漏的特殊原因,并且执行这样的事情是一种成熟的模式,用于存储回调可以使用的状态(就像您尝试做的那样)。


至于一般建议,doIt()函数的重点看起来有问题。 您似乎正在尝试返回由 this.doMagic() 设置的 result 值,但在执行时没有调用this.doMagic() doIt(),因此result在返回时永远不会有值doIt()

因此,整个结构似乎有缺陷。 要知道要推荐什么,需要了解您要完成的任务以及您如何调用/使用此尚未披露的代码。