2

在 Actionscript 中开发了各种重要的应用程序(作为 ECMAScript 的一种方言,它与 JS 有很多共同点),我现在习惯于特别注意(痴迷于)事件侦听器。在某些时候,在分析各种应用程序并阅读相关文献后,很明显,当事件侦听器存在时(即添加但从未删除),Flash 播放器的垃圾收集器将很难释放未使用的资源。

这导致了为充当事件侦听器的所有类型定义(并系统地调用)类似析构函数的方法的标准实践。后者负责删除在初始化时添加的所有侦听器。作为副作用,这需要放弃使用未命名函数作为事件侦听器,因为所有addEventListener(someMethod)调用都必须由 '对称' 匹配removeEventListener(someMethod)。另一种选择是使用弱引用。

现在,转向 Javascript,从未命名函数(和闭包)对语言的完整程度、它们作为事件侦听器的广泛使用以及互联网上普遍缺乏与侦听器相关的清理代码来看,似乎上述 Actionscript 运行时的缺点并没有被浏览器共享。

具体来说,在纯 Javascript 和 DOM 事件的情况下,我已经明白,当文档的某些部分被销毁时,GC 将释放所有相关资源,而不管是否附加了任何侦听器(这对于 AS 和它的“文档”,显示列表)。

我想这同样适用于主要处理 DOM 的 jQuery(考虑到 jQuery 在某些情况下内部执行自己的清理的可能性)。

它是否正确?

那么如何处理并非源自文档但使用某些库(例如 Backbone 的 Event 模块或 Node.js)定义和触发的自定义事件(及其侦听器)EventEmitter?是否应该期望“免费”提供类似的清理功能,或者这显然是另一种情况,应该注意删除任何添加的事件侦听器(从“死”对象中)以避免内存泄漏?

(如果这感觉太笼统,我很乐意提供具体示例作为进一步讨论的基础)

4

1 回答 1

2

我不认为 Javascript 中有任何“免费”的东西,而且我相信它与 GC 在删除的 DOM 元素上存在相同的问题。

这是使用好的库的好处之一。您提到了 jQuery——在更改 DOM 时移除侦听器非常勤奋。例如: http ://api.jquery.com/remove/

除了元素本身,所有与元素关联的绑定事件和 jQuery 数据都将被删除。

所以不要太高兴,但是勤奋地使用像 jQuery 这样的东西可以让你相对安全。

于 2012-07-20T19:22:08.400 回答