我有一个应用程序,用户可以在其中创建和销毁图形对象。这些对象中的每一个产生多个事件监听器。当对象被销毁(从DOM中删除)时,我是否必须删除所有这些事件侦听器?如果我不这样怎么办?我在JavaScript中清除事件处理程序有多重要?
在这种情况下,事件侦听器在对象本身上是mousedown
和mouseup
,文档正文上是mousemove
,但在一般情况下最佳做法是什么。
我有一个应用程序,用户可以在其中创建和销毁图形对象。这些对象中的每一个产生多个事件监听器。当对象被销毁(从DOM中删除)时,我是否必须删除所有这些事件侦听器?如果我不这样怎么办?我在JavaScript中清除事件处理程序有多重要?
在这种情况下,事件侦听器在对象本身上是mousedown
和mouseup
,文档正文上是mousemove
,但在一般情况下最佳做法是什么。
如果从DOM中删除对象,并且在实时Javascript变量中没有对它的任何引用,则该对象将被垃圾收集,并且与它关联的任何事件处理程序也将被丢弃。您不需要首先明确清除处理程序。
在现代浏览器(chrome/firefox/webkit)中,并不重要 - 当处理DOM元素时,与它们绑定的事件处理程序也是如此,因为两者都由相同的内存管理器处理。
对于IE9及以上版本也是如此。
但是,对于IE8和IE7,DOM和jScript有单独的内存管理器,这意味着除非您在处理DOM元素之前解除绑定事件并清空事件处理程序,否则不会释放内存。
您可以在这里IE版本阅读更多关于内存泄漏:
http://javascript.crockford.com/memory/leak.html
http://blog.j15r.com/blog/2009/07/12/Memory_Leaks_in_IE8
http://msdn.microsoft.com/en-us/library/bb250448(v=vs.85).aspx
http://www.codeproject.com/Articles/12231/Memory-Leakage-in-Internet-Explorer-revisited