1

我在文档中找不到任何关于开发人员在从具有绑定事件的 DOM 中删除元素时应该做什么的内容。jQuery 有 remove() 和 detach()。前者删除绑定事件,后者不删除。调用 Element#remove() 时,开发者应该怎么做?

4

1 回答 1

3

侦听器是元素对正在侦听的任何内容的引用——这意味着该元素将保留正在侦听的任何内容,直到该元素被 GC'd。

侦听不会添加从侦听器到元素的引用,因此可以在侦听器之前对元素进行 GC。

考虑 GC 的方式是引用——当对象 A 引用对象 B 时,对象 A 保留对象 B。但是除非对象 B 有对对象 A 的引用,否则 B 不会阻止 A 被 GC'd。事件是从目标到侦听器的引用,但不是相反。

此外,如果对象 A 具有对对象 B 的引用,而 B 具有对 A 的引用,那么它们都将彼此保持在周围,但如果没有任何东西对它们中的任何一个具有引用,那么它们都可以被 GC'd。

这一切的意思是,如果监听元素的代码预计有一个接近元素的生命周期,或者比元素长,那么它不需要取消监听。但是,如果预计元素是长寿命的,而听者是短寿命的,那么听者应该是分离的(这是有道理的——为什么短寿命的听者仍然在听东西?)。(答案由 Google 工程师 Pete Blois 提供)。

于 2013-11-21T22:41:52.780 回答