是避免IE内存泄漏所需的取消挂起事件处理程序

Is Unhooking event handlers needed to avoid memory leaks in IE

本文关键字:取消 挂起 事件处理 程序 IE 内存 泄漏      更新时间:2023-09-26

我在IE中遇到了一些内存泄漏问题。

我一直在读,在IE中不取消挂起事件处理程序,可能会导致内存泄漏。这是真的吗
当用户离开页面时,没有分离事件处理程序会导致内存泄漏吗?

Douglas Crockford有一篇关于JScript内存泄漏的优秀文章(JScript是IE对JavaScript/EMMAScript的实现)。

基本上可以归结为:IE对DOM和JScript有单独的内存管理(以及垃圾收集)。正因为如此,IE在清理DOM对象和事件处理程序之间的循环引用时遇到了问题。

解决此问题的方法是确保在丢弃DOM对象之前,始终从DOM对象中删除事件处理程序(或将它们设置为null)。

一些较旧的浏览器在这方面存在问题。当有注册的事件处理程序时,请考虑这一点;

1) 在脚本引擎中,保留了一个回调注册表,一个事件与两个东西绑定在一起,一个DOMNode和一个函数指针

2) DOMNode可能会"消失"——同样的事情可能会"发生"在函数上(但可能性较小)。

<a onclick="a = (a?a+1:0);" id="getme">...这样的代码会产生一个匿名函数,您将通过var anchor = document.getElementById('getme'); anchor.onclick'引用该函数。要完全清除它,除了分离eventlistener之外,还必须使用delete anchor.onclick

有些人可能会对这个代码感到愤怒,但它肯定会清除上的锚

var a=document.getElementById('getme')
window.detachEvent("onclick", a.onclick);
delete a.onclick;
a.parentNode.removeChild(a)