以下代码被视为导致内存泄漏,因为element
维护对函数bar
的引用,而bar
通过关闭维护对element
的引用(如果我理解的话)正确地)。
为什么这会导致内存泄漏?当element
是DOM节点时,它是否只会导致泄漏?
function foo(element, a, b) {
element.onclick = function bar() { /* uses a and b */ };
}
答案 0 :(得分:4)
这称为Javascript闭包,是Javascript的预期功能。这不是任何现代浏览器中的内存泄漏。
如果从DOM中删除了由element
表示的DOM元素,那么onclick处理程序将被垃圾收集,然后关闭本身将被垃圾收集。
在element
的生命周期内,变量a
和b
将成为闭包的一部分。这是一种预期的语言功能,因为它们是此代码创建的闭包的一部分。当从DOM中删除element
并且它被垃圾收集时,闭包及其引用a
和b
也将有资格进行垃圾收集。
有些旧的浏览器并不总能正确处理这个问题,但对于现代浏览器来说,这通常不再被视为设计考虑因素。此外,如果你一遍又一遍地运行这样的代码(每次都删除DOM元素),它只会造成一个后果问题,以至于当它们本来应该被垃圾收集的东西消耗了足够多的内存。 。这通常只发生在长时间运行的单页应用程序中,这些应用程序有很多动态DOM内容。但是,正如我在现代浏览器中所说的,这不再是一个问题,因为浏览器的垃圾收集器现在处理这种情况。
答案 1 :(得分:1)
此代码仅在某些旧版本的Internet Explorer中导致内存泄漏。 Internet Explorer 8对内存管理进行了一些更改,从而缓解了问题:
https://msdn.microsoft.com/en-us/library/dd361842(v=vs.85).aspx
由于所有受影响的Internet Explorer版本现已彻底过时,因此这不再是您需要关注的问题。