JavaScript闭包和内存泄漏

JavaScript闭包和内存泄漏,javascript,jquery,Javascript,Jquery,我在Jquery中读到,javascript闭包可能导致内存泄漏 非预期的闭包可能会产生非预期的后果。例如,循环引用可能导致内存泄漏。一个典型的例子是创建DOM元素,这些元素引用回闭包变量,防止这些变量被回收 有人能举个例子吗 谢谢大家! 这里,onClick有一个闭包,它保持对元素的引用。通过将onClick指定给元素。单击将创建圆圈:元素->onClick->元素->onClick function addClickHandler(element) { element.click =

我在Jquery中读到,javascript闭包可能导致内存泄漏

非预期的闭包可能会产生非预期的后果。例如,循环引用可能导致内存泄漏。一个典型的例子是创建DOM元素,这些元素引用回闭包变量,防止这些变量被回收

有人能举个例子吗


谢谢大家!

这里,
onClick
有一个闭包,它保持对
元素的引用。通过将
onClick
指定给
元素。单击
将创建圆圈:
元素
->
onClick
->
元素
->
onClick

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

在一些(大多数?当然不是所有)javascript引擎中,垃圾收集器不会收集一个甚至只有一个引用的对象。即使从DOM中删除了
元素
,上面的循环自引用也会阻止收集
元素
onClick
,因此内存泄漏。

具体问题是IE中的事件处理程序。基本上,如果您创建一个事件处理程序,然后在其作用域链中捕获它所连接的节点,那么IE将永远不会收集其中任何一个。这是IE中的一个bug,因为它使用了重计数而不是纯粹的GC来提高活力。

请看我的答案:这个bug在后来/更新版本的IE中修复了吗?似乎他们在IE8中解决了它:现在,我们所要做的就是等待十年,让人们停止使用旧的、有漏洞的IE版本:)最糟糕的是IE6的第一个版本。可怕的是,有些人从来没有使用过能在某种程度上改善情况的补丁。