Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript、事件、事件侦听器和内存泄漏_Javascript_Actionscript 3_Javascript Events_Garbage Collection - Fatal编程技术网

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

Javascript、事件、事件侦听器和内存泄漏,javascript,actionscript-3,javascript-events,garbage-collection,Javascript,Actionscript 3,Javascript Events,Garbage Collection,在Actionscript中开发了各种各样的应用程序(作为ECMAScript的一种方言,它与JS有很多共同之处),我现在习惯于特别关注(沉迷于)事件侦听器。在分析了各种应用程序并阅读了相关文献之后,很明显,当存在事件侦听器时(即添加但从未删除),Flash player的垃圾收集器很难释放未使用的资源 这导致了为充当事件侦听器的所有类型定义(并系统调用)类析构函数方法的标准实践。后者负责删除初始化时添加的所有侦听器。作为一个副作用,这要求放弃使用未命名函数作为事件侦听器,因为所有addEven

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

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

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

具体地说,在普通Javascript和DOM事件中,我已经了解到,当文档的某些部分被销毁时,GC将释放所有相关资源,而不管是否附加了任何侦听器(对于AS及其“文档”,即显示列表而言,这是不正确的)

我假设主要处理DOM的jQuery也是如此(考虑到jQuery在某些情况下内部执行自己的清理的可能性)

这是正确的吗

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

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


谢谢。

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

这是使用好的库的好处之一。您提到了jQuery——它在更改DOM时非常注意删除侦听器。例如:

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

所以,不要太高兴,但是勤奋地使用jQuery可以让您相对安全