在 ECMAScript 2020 中,引入了一些新的特性。其中最引人注目的是全局对象提供了 WeakRef 和 FinalizationRegistry 对象,这两个对象可以用于垃圾回收和内存管理。
WeakRef
WeakRef 提供了一种通过弱引用来引用对象的方法。它允许您保留对对象的引用,同时允许垃圾收集器在对象不再被使用时自动删除它们。
下面是一个简单的示例代码:
let obj = { a: 1 }; let wr = new WeakRef(obj); obj = null; let val = wr.deref(); console.log(val); // 输出为 undefined
在这个例子中,对象 obj
是一个普通的 JavaScript 对象。然后我们创建了一个 WeakRef 对象 wr
来引用它。接着,我们设置 obj
为 null
,这意味着我们不再拥有对该对象的强引用(即没有变量或属性持有它),因此垃圾回收器会立即删除该对象。最后,我们调用 wr.deref()
方法获取 obj
的值,而此时已经返回 undefined
。
可以看出 WeakRef 主要应用于一些需要维护大量对象的场景,并且避免手动维护对象之间的依赖关系,如缓存系统,浏览器中的 DOM 元素等。
FinalizationRegistry
FinalizationRegistry 可以用来在 JavaScript 对象被垃圾回收器回收时调用一个自定义的函数。这可用于释放与对象相关的资源或执行某些清理操作。
以下是一个示例代码:
let obj = { a: 1 }; let registry = new FinalizationRegistry(key => { console.log(key, 'finalized'); }); registry.register(obj, 'my key'); obj = null;
在这个例子中,我们使用 FinalizationRegistry 注册了对象 obj
,并为该对象在被回收时注册一个回调函数。当垃圾回收器删除 obj
时,会调用该回调函数,并将 key
的值(即 'my key'
)作为参数传递给它。
FinalizationRegistry 主要用于释放跨越多个对象的资源。例如,在使用 Web Worker 或 Shared Workers 时,可能需要在 JavaScript 对象生命周期结束时关闭与其关联的所有 worker,以防止内存泄漏。
总结
ECMAScript 2020 中的 WeakRef 和 FinalizationRegistry 是非常强大和方便的功能,可以提高开发者在进行内存管理和对运行时环境做出响应时的效率和优雅度。然而,它们并不总是必要了解的,因此只有在确实遇到类似的问题时才建议深入使用它们。
参考链接
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6529da4b7d4982a6ebc40629