JavaScript闭包和内存泄漏

时间:2009-06-05 04:19:35

标签: javascript jquery

我在Jquery的Action中读到内存泄漏可能是由于javascript关闭造成的。

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

有人会举一个例子吗?

谢谢你!

2 个答案:

答案 0 :(得分:2)

这里,onClick有一个闭包,它引用element。通过将onClick分配给element.click,可以创建圈子:element - > onClick - > element - > onClick ...

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

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

答案 1 :(得分:0)

具体问题是IE中的事件处理程序。基本上,如果你创建一个事件处理程序而不是捕获它附加到其作用域链中的节点,那么IE将永远不会收集它们中的任何一个。这是IE中的一个错误,因为它使用了引用计数而不是纯粹的GC来实现。