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

为什么这个JavaScript会导致内存泄漏?,javascript,Javascript,以下代码被视为导致内存泄漏,因为element通过闭包(如果我理解正确)维护对函数bar的引用和bar维护对element的引用 为什么这会导致内存泄漏?它是否仅在元素是DOM节点时才会导致泄漏 function foo(element, a, b) { element.onclick = function bar() { /* uses a and b */ }; } 此代码仅在某些旧版本的Internet Explorer中导致内存泄漏。Internet Explorer 8对内存管理

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

为什么这会导致内存泄漏?它是否仅在
元素
是DOM节点时才会导致泄漏

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

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


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

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


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

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

如果从DOM中删除由
元素
表示的DOM元素,则onclick处理程序将被垃圾收集,然后闭包本身将被垃圾收集

元素
的生命周期内,变量
a
b
将成为闭包的一部分。这是预期的语言特性,因为它们是此代码创建的闭包的一部分。当且如果从DOM中删除
元素
并对其进行垃圾收集,则闭包及其引用
a
b
也将符合垃圾收集的条件


有些旧浏览器并不总是能够正确处理这一问题,但对于现代浏览器来说,这通常不再被视为设计考虑因素。此外,如果您反复运行这样的代码(每次也删除DOM元素),导致大量内存被本应进行垃圾收集的未进行垃圾收集的内容占用,那么这只会导致后果问题。这通常只发生在长时间运行的单页应用程序中,这些应用程序中有很多动态DOM内容。但是,正如我在现代浏览器中所说的,这不再是一个问题,因为浏览器的垃圾收集器现在处理这种情况。

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

如果从DOM中删除由
元素
表示的DOM元素,则onclick处理程序将被垃圾收集,然后闭包本身将被垃圾收集

元素
的生命周期内,变量
a
b
将成为闭包的一部分。这是预期的语言特性,因为它们是此代码创建的闭包的一部分。当且如果从DOM中删除
元素
并对其进行垃圾收集,则闭包及其引用
a
b
也将符合垃圾收集的条件


有些旧浏览器并不总是能够正确处理这一问题,但对于现代浏览器来说,这通常不再被视为设计考虑因素。此外,如果您反复运行这样的代码(每次也删除DOM元素),导致大量内存被本应进行垃圾收集的未进行垃圾收集的内容占用,那么这只会导致后果问题。这通常只发生在长时间运行的单页应用程序中,这些应用程序中有很多动态DOM内容。但是,正如我在现代浏览器中所说的,这不再是一个问题,因为浏览器的垃圾收集器现在处理这种情况。

那么这类问题(创建循环对象引用)不再是一个问题了?我假设垃圾收集器能够检测到对象图的“孤岛”?更多关于“循环对象引用”的信息可以在这里找到:@BenAston Correct。科技进步,;现代JS运行时可以检测和收集循环引用。@Daskwuff鉴于此,您能告诉我如何在现代浏览器上创建JS内存泄漏吗?@BenAston不可靠。现代web浏览器中的任何内存泄漏都是一个bug,应该报告给相应的开发人员进行修复。那么这类问题(创建循环对象引用)就不再是问题了?我假设垃圾收集器能够检测到对象图的“孤岛”?更多关于“循环对象引用”的信息可以在这里找到:@BenAston Correct。科技进步,;现代JS运行时可以检测和收集循环引用。@Daskwuff鉴于此,您能告诉我如何在现代浏览器上创建JS内存泄漏吗?@BenAston不可靠。现代web浏览器中的任何内存泄漏都是一个bug,应该报告给相应的开发人员进行修复。我被告知,无论是将元素变量(
var elem=document.getElementById('id');elem.onclick=function(){/*…*/};elem=null;
)置空,还是不将变量用于元素(
document.getElementById('id')).onclick=function(){/*…*/};
)将修复
IE@GitaarLAB-在IE 8之前的IE版本中,您是否认真尝试处理内存泄漏问题?在古代浏览器中,不创建闭包可能是避免此类问题的最佳方法。一般认为现在不应该花时间在开发上。是的。但这也很有趣。我碰巧维护了一些使用嵌入式IE控件的遗留东西。我还维护了一些东西,需要向后兼容。但最终。。信息从来没有伤害过任何人(比如一个未来的访客,他想知道“当时”他们是如何解决问题的)……我被告知,两者都会使ele无效