直接上结论吧, 使用的就是FinalizationRegistry 这个构造函数
FinalizationRegistry
是 JavaScript 中的一个高级特性,它允许你在一个对象被垃圾回收时注册一个回调函数。这个特性是 ES2021(即 ECMAScript 2021)引入的一部分,属于 JavaScript 语言的一个扩展。
作用
FinalizationRegistry
的主要用途是允许开发者在对象被垃圾回收时执行一些清理工作,如释放资源、清理缓存等。需要注意的是,FinalizationRegistry
的使用场景相对较少,且应该非常谨慎地使用,因为它与垃圾回收的时机相关,而这个时机是不确定的。
使用方法
你可以创建一个 FinalizationRegistry
实例,并为其提供一个回调函数。当注册到该 FinalizationRegistry
的对象被垃圾回收时,该回调函数会被调用。
javascript
const registry = new FinalizationRegistry((heldValue) => {
// 在对象被垃圾回收时执行的清理操作
console.log(heldValue + ' 被垃圾回收了');
});
{
const obj = {};
// 注册对象到 FinalizationRegistry 实例
// obj 是需要被监视的对象,当它被回收时回调函数会被执行
// 'obj' 是一个标识,会在回调中使用,以帮助识别被回收的对象
registry.register(obj, 'obj');
}
// 注意这里,并不会马上就会 被回收,因为垃圾回收的时机本身是不确定的
// 当 obj 退出作用域并被垃圾回收时,回调函数会被执行
注意事项
并不会马上被回收♻️
FinalizationRegistry
和与之相关的操作(如注册和取消注册对象)应谨慎使用,因为它们可能会导致不可预测的行为,尤其是与垃圾回收的时机有关。- 回调函数的执行是异步的,并且不保证一定会执行。因为 JavaScript 的垃圾回收时机是不确定的,而且在某些情况下,如果页面关闭或浏览器崩溃,回调可能永远不会被调用。
- 不要在回调函数中保持对预期被垃圾回收对象的引用,这会导致该对象无法被回收,产生内存泄漏。
FinalizationRegistry
主要用于清理和资源释放等边缘情况,平时开发中应优先考虑使用更明确和直接的资源管理方式。
我们可以手动触发垃圾回收。
总的来说,FinalizationRegistry
提供了一种机制,让你可以在对象被垃圾回收时得到通知并执行一些操作。可以帮助我们很好的理解垃圾回收的原理,在特定情况下可以去更好的 查看我们所关心的对象有没有被回收。
文献