【问题标题】:JavaScript Closures and Memory LeaksJavaScript 闭包和内存泄漏
【发布时间】:2009-06-05 04:19:35
【问题描述】:

我在 Jquery in Action 中读到内存泄漏可能是由 javascript 闭包引起的。

“意外的闭包可能会产生意想不到的后果。例如,循环引用会导致内存泄漏。一个典型的例子是创建引用闭包变量的 DOM 元素,从而阻止这些变量被回收。”

有人可以举个例子吗?

谢谢!

【问题讨论】:

标签: javascript jquery


【解决方案1】:

这里,onClick 有一个闭包,它保持对element 的引用。通过将onClick 分配给element.click 来创建圆圈:element -> onClick -> element -> onClick...

function addClickHandler(element) {
    element.click = function onClick(e) {
        alert("Clicked the " + element.nodeName)
    }
}

在某些(大多数?当然不是全部)javascript 引擎中,垃圾收集器不会收集一个对象,即使它只有一个引用。即使 element 从 DOM 中删除,上面的循环自引用也会阻止 elementonClick 被收集,从而导致内存泄漏。

【讨论】:

    【解决方案2】:

    具体问题是 IE 中的事件处理程序。基本上,如果您创建一个事件处理程序而不是捕获它在其范围链内附加到的节点,那么 IE 将永远不会收集它们中的任何一个。这是 IE 中的一个错误,因为它使用引用计数而不是纯 GC 来提高活性。

    【讨论】:

    • 这个错误是否在更高版本的 IE 中修复?
    • 好像他们在 IE8 中使用了它:msdn.microsoft.com/en-us/library/dd361842(VS.85).aspx 现在,我们所要做的就是等待十年让人们停止使用旧的、泄漏的 IE 版本 :)
    • 最糟糕的是IE6的第一个版本。更可怕的是,有些人从未应用过能在一定程度上有所改善的补丁。
    猜你喜欢
    • 2013-01-11
    • 2021-08-02
    • 2017-11-25
    • 2013-03-29
    • 2013-07-12
    • 2016-01-12
    • 2012-06-26
    • 2015-06-11
    • 1970-01-01
    相关资源
    最近更新 更多