0

我正在阅读一个在线 JavaScript 教程,其中声称以下代码将导致 IE 中早于版本 8 的内存泄漏。

function setHandler() {
  var elem = document.getElementById('id')
  elem.onclick = function() { /* ... */ }
}

作者还提供了防止内存泄漏的修复:

function setHandler() {
  var elem = document.getElementById('id')
  elem.onclick = function() { /* ... */ }
  elem=null;
}

为什么原始代码会导致内存泄漏,修复如何防止它?

4

1 回答 1

3

文章给出了很好的解释,问题是IE和循环引用。

这意味着当你这样做时:

function setHandler() { 
  var elem = document.getElementById('id') // (1)
  elem.onclick = function() { /* ... */ } //(2)
}

函数的第一行引用第二行,第二行引用第一行,这导致 IE 无法释放它分配的内存来创建 elem 变量。

您通过显式删除第二个引用来破坏引用,通过“破坏”elem 的值,在该行

elem = null

所以IE可以释放内存

第二个引用的发生是因为闭包有问题,绑定在 onclick 中的内部函数可以访问elem(它存在于函数范围内),所以它被“锁定”在那里。

换句话说,有两个对 elem 的引用,一个在 var 语句中创建,一个在 onclick 函数中创建,并且在释放闭包之前不会释放该引用。

您可以在此处此处此堆栈溢出答案中找到更多信息

于 2012-08-07T02:37:17.207 回答