我有一个应用程序,用户可以在其中创建和销毁图形对象。这些对象中的每一个都会产生多个事件侦听器。当对象被销毁(从 DOM 中删除)时,我是否必须删除所有这些事件侦听器?如果我不这样做会发生什么?
在这种情况下,事件侦听器位于mousedown
对象mouseup
本身和mousemove
文档正文上,但在一般情况下最佳实践是什么。
我有一个应用程序,用户可以在其中创建和销毁图形对象。这些对象中的每一个都会产生多个事件侦听器。当对象被销毁(从 DOM 中删除)时,我是否必须删除所有这些事件侦听器?如果我不这样做会发生什么?
在这种情况下,事件侦听器位于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