javascript - 使用 this/self 引用的 javascript 闭包会导致内存泄漏吗?

标签 javascript events memory-leaks this

根据我对内存泄漏的理解,在闭包中引用范围外的 var 会导致内存泄漏。

但创建“that”var 以保留“this”引用并在闭包中使用它也是一种常见的做法,尤其是对于事件。

那么,做这样的事情有什么用:

SomeObject.prototype.createImage = function(){
    var that = this,
        someImage = new Image();
    someImage.src = 'someImage.png';
    someImage.onload = function(){
        that.callbackImage(this);
    }
};

这不会给项目增加一点漏洞吗?

最佳答案

是的,是的,它确实会导致内存泄漏,至少在某些浏览器中(猜猜是哪个)。这是让您信任可用的各种框架之一并通过其机制设置所有事件处理程序而不是像那样直接添加“DOM 0”事件处理程序的更有说服力的理由之一。

Internet Explorer(至少在 9 之前,可能包括 9)在内部(至少)有两种内存分配机制:一种用于 DOM,一种用于 JavaScript(以及 JScript)。他们彼此不了解。因此,即使释放了 DOM 节点,您示例中的任何闭包内存也不会被释放。

编辑 — 哦,我提到框架的原因是它们通常包含尝试缓解此问题的代码。避免将任何东西附加到 DOM 节点属性是最安全的方法之一。例如,所有值得担心的浏览器(包括古老的 IE 版本)都有将事件处理程序附加到 DOM 节点的替代方法。

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

相关文章:

c# - 如何在用户控件中使用委托(delegate)和事件?

c# - 继承自 System.Timers.ElapsedEventArgs 使单元测试更容易

C,没有 malloc 的 fork 泄漏

javascript - 函数中惯用的 jQuery 和选择器路径

javascript - ng-repeat 数据仅在文本框焦点更改后更新

javascript - Angular $http POST 到目标 ="_blank"

c++ - 在两行之间检测 visual studio c++ 中的内存泄漏

javascript - 如何有条件地隐藏对象数组中的对象?

javascript - 如何在 AngularJs 服务中创建自定义事件

javascript - 递归 setTimeout 调用是否会导致闭包链内存泄漏?