在 JavaScript 中清除事件处理程序有多重要? [复制]
Posted
技术标签:
【中文标题】在 JavaScript 中清除事件处理程序有多重要? [复制]【英文标题】:How important is it that I clear event handlers in JavaScript? [duplicate] 【发布时间】:2013-09-03 16:41:42 【问题描述】:我有一个应用程序,用户可以在其中创建和销毁图形对象。这些对象中的每一个都会产生多个事件侦听器。当对象被销毁(从 DOM 中删除)时,我是否必须删除所有这些事件侦听器?如果我不这样做会发生什么?
在这种情况下,事件侦听器是对象本身的mousedown
和mouseup
,以及文档正文上的mousemove
,但一般情况下的最佳做法是什么。
【问题讨论】:
【参考方案1】:如果对象从 DOM 中移除,并且您在实时 javascript 变量中没有对它的任何引用,则该对象将被垃圾回收,并且与之关联的任何事件处理程序也将被丢弃。您无需先明确清除处理程序。
【讨论】:
【参考方案2】:在现代浏览器(chrome/firefox/webkit)中,这无关紧要 - 何时释放 DOM 元素,与它们相关联的事件处理程序也是如此,因为两者都由同一个内存管理器处理。
IE9 及更高版本也是如此。
然而,对于 IE8 和 IE7,DOM 和 jScript 有单独的内存管理器,这意味着除非在释放 DOM 元素之前取消绑定事件并将事件处理程序设为 null,否则不会释放内存。
您可以在此处阅读有关 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
【讨论】:
【参考方案3】:最坏的情况 - 您的事件仍然以某种方式被触发,并且您的代码占用了大量不必要的资源。
如果您真的要从 DOM 中删除元素,那么这可能无关紧要,但它仍然可能导致内存泄漏,具体取决于代码的 scope 和 closure。
如果不难,删除它们很好。我不会说这是必需的。
【讨论】:
以上是关于在 JavaScript 中清除事件处理程序有多重要? [复制]的主要内容,如果未能解决你的问题,请参考以下文章