繁体   English   中英

Javascript、事件、事件侦听器和内存泄漏

[英]Javascript, events, event listeners and memory leaks

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

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

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

具体来说,在纯 Javascript 和 DOM 事件的情况下,我开始理解当文档的某些部分被销毁时,无论是否附加任何侦听器,GC 都会释放所有相关资源(这对于 AS 和它的“文档”,显示列表)。

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

这样对吗?

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM