1

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

在这种情况下,事件侦听器在对象本身上是mousedownmouseup,文档正文上是mousemove,但在一般情况下最佳做法是什么。

回答

0

如果从DOM中删除对象,并且在实时Javascript变量中没有对它的任何引用,则该对象将被垃圾收集,并且与它关联的任何事件处理程序也将被丢弃。您不需要首先明确清除处理程序。

0

最糟糕的情况 - 您的事件仍然以某种方式触发,您的代码占用了大量不必要的资源。

如果您真的从DOM中删除元素,那么它可能并不重要,但它仍可能导致内存泄漏,具体取决于代码的scopeclosure

如果不难,删除它们是很好的。我不会说这是必需的。

0

在现代浏览器(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