5

如果我在 javascript 中的任何元素上添加事件处理程序,例如

var link = document.createElement("a");

document.body.appendChild(link);


link.addEventListner("click",function(){

     alert("do something");

});

然后我删除链接

link.parrentNode.removeChild(link);

那么我附加到链接的事件又会被删除还是保留在内存中(与事件在内存中的存储方式和存储时间有点混淆)或者我应该先删除事件处理程序然后删除链接节点。

4

2 回答 2

3

调用垃圾收集器时,几乎所有浏览器都会从内存中删除事件处理程序。但是,IE6 及以下版本有一个已知错误,可能导致事件处理程序没有被垃圾收集,从而导致页面泄漏内存。

在删除元素之前清理事件处理程序曾经被认为是一种很好的做法(实际上,像 YUI 和 JQuery 这样的库有这方面的功能)。但是这些天我会说,如果你关心 IE6,我只会担心这个。


注意:如果您想知道这个错误。这是因为 IE 的垃圾收集器在涉及 DOM 时无法处理循环引用(在较旧的 IE 上,即使不涉及 DOM,它也无法处理循环引用)。

例如,如果你有这样的代码:

myDiv.onclick = function () { myDiv.style.backgroundColor = 'red' }
//                               ^
//                               |
//                     circular reference

然后 IE6 及更低版本无法释放事件处理程序。但是,如果您的事件处理程序不包含任何对它所附加的 DOM 对象的循环引用,那么 IE 将对其进行垃圾收集。

于 2013-09-26T05:11:50.253 回答
1

在 javascript 函数表达式(在您的情况下为事件绑定)分配一个对象并因此消耗内存。您应该正确移除或处理它。检查这个链接,它详细解释了内存管理。

Js 内存管理

检查垃圾收集部分。

于 2013-09-26T05:08:29.573 回答