当附加的 DOM 节点像事件的 removeEventListener 一样被删除时,是否应该删除/断开 MutationObservers?

bit*_*ess 6 javascript mutation-observers

在这里发现了一个几乎相同的问题:Should an IntersectionObserver is disconnected when element is removed

我还没有找到说明MutationObserver从 DOM 中删除带有附加(MO)的元素时应该做什么的文档。API 不提供像 那样的 remove 方法removeEventListener,只是一个disconnect只涉及子节点的临时方法。垃圾收集最终会出现,但似乎在 SPA 网络应用程序中可能会变得混乱/臃肿。我可以使用delete关键字来删除保存 MO 的变量,但我已经阅读了这样做的警告(不一定适用于 MO),而不是让垃圾收集处理它。

因此,我正在寻找官方信息,例如“删除关联的 DOM 元素时删除 MO”,或“不再使用分配的变量时,MO 会自动垃圾回收”,或“MO 应从其父对象中删除”如果它们不再被使用,“等等。

规范:https : //dom.spec.whatwg.org/#mutation-observers

bit*_*ess 7

当我更多地研究这个话题时,我似乎找到了答案。

在垃圾回收的眼中,MO 与 DOM 元素紧密耦合,而它们的后代是松散耦合的。因此,您似乎可以随时删除 DOM 元素,而垃圾收集应该处理其余部分。

官方回答https://dom.spec.whatwg.org/#garbage-collection

4.3.4. 垃圾收集

节点在其注册观察者列表中对注册观察者有很强的引用。

节点的注册观察者列表中的注册观察者对该节点具有弱引用。

  • 也就是说,MDN 在 https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver/disconnect#usage_notes 中对此说得相当清楚:“如果被观察的元素从 DOM 中删除,然后随后由浏览器的垃圾收集机制释放,MutationObserver 也同样被删除。” 我只是无法在实践中看到这一点:-/ (2认同)