为什么这个JavaScript会导致内存泄漏?

时间:2015-02-21 20:41:27

标签: javascript

以下代码被视为导致内存泄漏,因为element维护对函数bar的引用,而bar通过关闭维护对element的引用(如果我理解的话)正确地)。

为什么这会导致内存泄漏?当element是DOM节点时,它是否只会导致泄漏?

function foo(element, a, b) {
  element.onclick = function bar() { /* uses a and b */ };
}

2 个答案:

答案 0 :(得分:4)

这称为Javascript闭包,是Javascript的预期功能。这不是任何现代浏览器中的内存泄漏。

如果从DOM中删除了由element表示的DOM元素,那么onclick处理程序将被垃圾收集,然后关闭本身将被垃圾收集。

element的生命周期内,变量ab将成为闭包的一部分。这是一种预期的语言功能,因为它们是此代码创建的闭包的一部分。当从DOM中删除element并且它被垃圾收集时,闭包及其引用ab也将有资格进行垃圾收集。

有些旧的浏览器并不总能正确处理这个问题,但对于现代浏览器来说,这通常不再被视为设计考虑因素。此外,如果你一遍又一遍地运行这样的代码(每次都删除DOM元素),它只会造成一个后果问题,以至于当它们本来应该被垃圾收集的东西消耗了足够多的内存。 。这通常只发生在长时间运行的单页应用程序中,这些应用程序有很多动态DOM内容。但是,正如我在现代浏览器中所说的,这不再是一个问题,因为浏览器的垃圾收集器现在处理这种情况。

答案 1 :(得分:1)

此代码仅在某些旧版本的Internet Explorer中导致内存泄漏。 Internet Explorer 8对内存管理进行了一些更改,从而缓解了问题:

https://msdn.microsoft.com/en-us/library/dd361842(v=vs.85).aspx

由于所有受影响的Internet Explorer版本现已彻底过时,因此这不再是您需要关注的问题。