Javascript,事件,事件监听器和内存泄漏

时间:2012-07-20 19:17:13

标签: javascript actionscript-3 javascript-events garbage-collection

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

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

现在,继续使用Javascript,判断整合的未命名函数(和闭包)对语言的影响,它们作为事件监听器的广泛使用,以及在互联网上普遍缺乏与监听器相关的清理代码,似乎浏览器不共享Actionscript运行时的上述缺点。

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

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

这是对的吗?

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

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

感谢。

1 个答案:

答案 0 :(得分:2)

我认为Javascript中没有“免费”的东西,我相信它在删除DOM元素时与GC有同样的问题。

这是使用好图书馆的好处之一。你提到了jQuery - 在改变DOM时删除监听器非常勤奋。例如: http://api.jquery.com/remove/

  

除了元素本身之外,还删除了与元素关联的所有绑定事件和jQuery数据。

所以不要太高兴,但是像jQuery一样努力使用可以让你相对安全。