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

标签 javascript backbone.js memory-leaks

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

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

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

    self = null;

    return result
}

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

额外的问题,闭包对“结果”的引用也会导致内存泄漏吗?

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

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

谢谢!

最佳答案

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

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

我在这段代码中看不出为什么使用变量 self 会导致内存泄漏,并且执行类似的操作是存储回调可以使用的状态的一种行之有效的模式(只是就像你想做的那样)。

<小时/>

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

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

关于javascript - 在闭包中使用 'self' 会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28140480/

相关文章:

javascript - 如何使 jquery 插件选项 true/false 变成更紧凑的形式?

javascript - 路由更改时从 Backbone View 中清除间隔

Java VisualVM 内存采样器 - 如何获取特定类的大小

c# - 如何研究 .NET 中的非托管内存泄漏?

javascript - 如果新的焦点元素不是子元素,则 jQuery 模糊

javascript - 分屏中的站点容器

javascript - 未触发 IOS 页隐藏。无法检测页面卸载

javascript - "Cannot call method ' 关于 ' of undefined"问题

backbone.js - url和urlRoot有什么区别

c++ - 如何使用valgrind?