为什么在document.getElementById-ed之后对象必须被IE取消?

jay*_*rjo 5 javascript null internet-explorer dom memory-leaks

我经常在第三方JavaScript代码中看到:

var el = document.getElementById(elementId);
Run Code Online (Sandbox Code Playgroud)

对象通常是无效的,并且沿着此操作发表评论说它是针对IE完成的:

el = null; // IE
Run Code Online (Sandbox Code Playgroud)

真正的目的是什么?关于那的任何资源?

kat*_*ugh 6

通过nixing引用,它们打破了DOM对象和JavaScript对象之间的相应循环依赖性,这些对象由旧IE中的不同子系统控制(因此不可能被垃圾收集).

例如:

var el = document.getElementById(elementId);
el.onclick = function () { // here the cyclic reference is created
    /...
};
Run Code Online (Sandbox Code Playgroud)

JavaScript子系统现在具有对该el元素的引用,并且DOM子系统(该el元素)具有对JavaScript对象的引用(该函数加上它关闭的内容).

但是,如果通过添加侦听器,则不必担心addEventListener.

要阅读有关常见内存泄漏缺陷的更多信息,请访问http://www.ibm.com/developerworks/web/library/wa-memleak/.