在 JavaScript 中清除事件处理程序有多重要? [复制]

Posted

技术标签:

【中文标题】在 JavaScript 中清除事件处理程序有多重要? [复制]【英文标题】:How important is it that I clear event handlers in JavaScript? [duplicate] 【发布时间】:2013-09-03 16:41:42 【问题描述】:

我有一个应用程序,用户可以在其中创建和销毁图形对象。这些对象中的每一个都会产生多个事件侦听器。当对象被销毁(从 DOM 中删除)时,我是否必须删除所有这些事件侦听器?如果我不这样做会发生什么?

在这种情况下,事件侦听器是对象本身的mousedownmouseup,以及文档正文上的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 中清除事件处理程序有多重要? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在严格的javascript事件处理程序中使用这个?

请简单说明javascript中处理事件的步骤

在 Javascript 中访问事件处理程序中的类成员变量

Javascript事件处理程序的3种方式

Qt、多重继承、包装器或事件过滤器

从DOM元素清除事件处理程序