【发布时间】:2009-06-05 04:19:35
【问题描述】:
我在 Jquery in Action 中读到内存泄漏可能是由 javascript 闭包引起的。
“意外的闭包可能会产生意想不到的后果。例如,循环引用会导致内存泄漏。一个典型的例子是创建引用闭包变量的 DOM 元素,从而阻止这些变量被回收。”
有人可以举个例子吗?
谢谢!
【问题讨论】:
标签: javascript jquery
我在 Jquery in Action 中读到内存泄漏可能是由 javascript 闭包引起的。
“意外的闭包可能会产生意想不到的后果。例如,循环引用会导致内存泄漏。一个典型的例子是创建引用闭包变量的 DOM 元素,从而阻止这些变量被回收。”
有人可以举个例子吗?
谢谢!
【问题讨论】:
标签: javascript jquery
这里,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 中删除,上面的循环自引用也会阻止 element 和 onClick 被收集,从而导致内存泄漏。
【讨论】:
具体问题是 IE 中的事件处理程序。基本上,如果您创建一个事件处理程序而不是捕获它在其范围链内附加到的节点,那么 IE 将永远不会收集它们中的任何一个。这是 IE 中的一个错误,因为它使用引用计数而不是纯 GC 来提高活性。
【讨论】: