根据我对内存泄漏的理解,在闭包中引用范围外的 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/