JavaScript内存泄漏-DOM节点和子体上的垃圾收集

JavaScript内存泄漏-DOM节点和子体上的垃圾收集,javascript,dom,garbage-collection,Javascript,Dom,Garbage Collection,在现代浏览器中,只要DOM节点没有指向它们的引用,垃圾收集器就会将其从内存中删除(事件侦听器的特例*) 我正在寻找一些关于DOM后代节点的清晰信息。我假设后代关系是单向父->子关系。因此,如果父节点未连接到DOM,并且没有引用,则将收集它,并为子元素获得domino效果。这是正确的吗 或者是否需要遍历节点并分离所有节点 我假设后代关系是单向父->子关系 不,这些关系是双向的 但这对垃圾收集器(至少不是mark-sweep类型)来说并不重要,因为垃圾收集器只关心可达性,而不关心对象的连接性。 如果

在现代浏览器中,只要DOM节点没有指向它们的引用,垃圾收集器就会将其从内存中删除(事件侦听器的特例*)

我正在寻找一些关于DOM后代节点的清晰信息。我假设后代关系是单向父->子关系。因此,如果父节点未连接到DOM,并且没有引用,则将收集它,并为子元素获得domino效果。这是正确的吗

或者是否需要遍历节点并分离所有节点

我假设后代关系是单向父->子关系

不,这些关系是双向的


但这对垃圾收集器(至少不是mark-sweep类型)来说并不重要,因为垃圾收集器只关心可达性,而不关心对象的连接性。 如果使用引用计数,则需要一个循环采集器来检测这种情况,但仍然可以收集整个子树,而无需先断开子树的连接

或者是否需要遍历节点并分离所有节点

不需要这样做,除非您希望保留对某个子节点的引用,但仍然希望收集断开连接的树的其他部分

我可以问一下,这是否适用于带有引用节点的匿名函数的EventListener

如果匿名函数的作用域链中有dom节点本身(或另一个持有dom节点的对象),那么它取决于是否有其他对象持有该函数实例

更一般地说:任何对象都有资格进行垃圾收集,除非它可以从GC根访问

在第一种近似情况下,浏览器中的主要GC根是全局/窗口对象。如果窗口对象消失,其他所有操作都会消失

来自GC根的路径可能非常长且复杂,因此在某些情况下,必须仔细考虑它们。
DOM节点引用它们的回调函数,回调函数引用它们的作用域链,作用域链可以引用其他DOM节点等等。

是的,这是正确的“我假设后代关系是单向父->子关系”。每个节点也有一个
.parent
属性。“垃圾收集器只关心可达性”所以这不是缺少参考资料吗?缺少指向DOM或脚本执行的引用?那真的很有用!我可以问一下这是否适用于带有引用节点的匿名函数的EventListener,或者我应该发布一个新问题吗?