DOM node.remove() 不会使 Javascript 变量引用无效。如何解决?
DOM node.remove() does not invalidate Javascript Variable Reference. How to fix that?
我在 Chromium 控制台中做了这个简单的测试:
var e = document.querySelector('#myElement');
e.remove();
//But here, 'e' still references the original node even though its no longer in the DOM.
我不想要这种行为。我希望 'e' 更像一个弱引用,它会变为 NULL 或 UNDEFINED 或 something 表明节点已被破坏。
我知道问题是由于节点在技术上仍然存在,即使它不再是 DOM 的一部分。我推测它会一直存在,直到浏览器认为合适的时间对其进行垃圾回收。
因此,除了简单地执行 .remove() 之外,是否有一种方法可以真正 destroy/delete 节点,以便所有引用它的变量都将变为未定义或 null 或稍后可以检测到的某些效果?
提前致谢!
另外,我推测这种行为在浏览器之间会有很大差异。因此,也非常欢迎任何提及非 Chromium 浏览器的反馈。 :)
如果一个独立的变量持有一个对象的引用,并且该变量仍然可以被引用,垃圾收集器的 mark-and-sweep 算法将不会拾取该对象,并且该对象将继续存在于至少只要变量仍然可以被引用。
给定一个对象的引用,您不能销毁它以致其他对该对象的引用中断。
不幸的是,JavaScript 没有提供您正在寻找的那种手动内存控制。
您可以将元素放入 WeakSet 中,然后从 DOM 中删除元素最终会导致元素从 WeakSet 中删除,如果没有其他可能引用该元素 - 但事实并非如此你在找
确实存在WeakRefs,一个非常新的API,它允许对变量进行特殊声明,以便它们引用的内容可以被垃圾收集,尽管他们仍然可以参考:
const ref = (() => {
const e = document.querySelector('#myElement');
const ref = new WeakRef(e);
e.remove();
return ref;
})();
有了上面的内容,调用 ref.deref()
最终会给你 undefined
如果没有其他东西可以引用该元素并且它已被垃圾收集。 (在它被垃圾收集之前,.deref()
会给你元素。)
我在 Chromium 控制台中做了这个简单的测试:
var e = document.querySelector('#myElement');
e.remove();
//But here, 'e' still references the original node even though its no longer in the DOM.
我不想要这种行为。我希望 'e' 更像一个弱引用,它会变为 NULL 或 UNDEFINED 或 something 表明节点已被破坏。
我知道问题是由于节点在技术上仍然存在,即使它不再是 DOM 的一部分。我推测它会一直存在,直到浏览器认为合适的时间对其进行垃圾回收。
因此,除了简单地执行 .remove() 之外,是否有一种方法可以真正 destroy/delete 节点,以便所有引用它的变量都将变为未定义或 null 或稍后可以检测到的某些效果?
提前致谢!
另外,我推测这种行为在浏览器之间会有很大差异。因此,也非常欢迎任何提及非 Chromium 浏览器的反馈。 :)
如果一个独立的变量持有一个对象的引用,并且该变量仍然可以被引用,垃圾收集器的 mark-and-sweep 算法将不会拾取该对象,并且该对象将继续存在于至少只要变量仍然可以被引用。
给定一个对象的引用,您不能销毁它以致其他对该对象的引用中断。
不幸的是,JavaScript 没有提供您正在寻找的那种手动内存控制。
您可以将元素放入 WeakSet 中,然后从 DOM 中删除元素最终会导致元素从 WeakSet 中删除,如果没有其他可能引用该元素 - 但事实并非如此你在找
确实存在WeakRefs,一个非常新的API,它允许对变量进行特殊声明,以便它们引用的内容可以被垃圾收集,尽管他们仍然可以参考:
const ref = (() => {
const e = document.querySelector('#myElement');
const ref = new WeakRef(e);
e.remove();
return ref;
})();
有了上面的内容,调用 ref.deref()
最终会给你 undefined
如果没有其他东西可以引用该元素并且它已被垃圾收集。 (在它被垃圾收集之前,.deref()
会给你元素。)