ECMAScript(简称为 ES)是一种由 Ecma 国际组织标准化的脚本语言,常用于 Web 开发中的前端页面。ES2020(简称 ES11)是最新版本的 ECMAScript 标准,于 2020 年 6 月发布。本文将介绍 ES11 中的一项新特性:WeakRefs 和 Finalizers。
WeakRefs 与 Finalizers 的作用
WeakRefs 和 Finalizers 是两个 JavaScript 的垃圾回收(Garbage Collection)相关功能,用于更好地管理 JavaScript 内存的生命周期。
在 JavaScript 中,当一个对象不再被需要时,垃圾回收机制会自动回收其占用的内存空间。但是,有时候我们需要在内存中保留某些对象,比如缓存对象或事件监听器,但是又不想完全阻止它们被垃圾回收机制清理。这时候就可以用到 WeakRefs 和 Finalizers。
WeakRefs(弱引用)是一种对象引用,它不会阻止垃圾回收机制将其所引用的对象清除掉。而 Finalizers(终结器)则是一种回调函数,它会在垃圾回收器清理对象之前调用,可以用来释放关联的资源。
这两个功能的联合使用可以更好地在 JavaScript 中管理内存,避免内存泄漏和提高代码效率。
WeakRefs 的语法
使用 WeakRefs 可以创建一个弱引用对象,如下所示:
const obj = { name: 'John' }; const weakRef = new WeakRef(obj);
在上面的代码中,obj
是一个普通的 JavaScript 对象,weakRef
是一个弱引用对象。
我们可以通过 WeakRef 对象的 deref()
方法,检查它所引用的对象是否还存在:
if (weakRef.deref() !== null) { // 对象还存在 } else { // 对象已经被回收掉了 }
当它引用的对象被垃圾回收机制回收掉时,deref()
方法会返回 null
。
Finalizers 的语法
使用 Finalizers 可以创建一个回调函数,用于在对象被垃圾回收清理前释放相关资源。下面是一个使用 Finalizers 的示例代码:
-- -------------------- ---- ------- ----- ----- - ------------- - -------------- - --- --------------------------------- -------------- - --- ------------------------ -- - --------------------- --- ----------------------------- --------- - - --- --- - --- -------- --- - ----- -- ------
上面的代码中,MyObj
是一个自定义类,它会创建一个占用大量内存资源的 resources
数组,并且在构造函数中使用 Finalizers 注册一个回调函数,以便在对象被回收前释放资源。在最后一行代码中,我们将 obj
赋值为 null
,触发垃圾回收机制。
当 obj
对象被垃圾回收器清理时,Finalizers 注册的回调函数会被调用,从而释放 resources
数组占用的内存。
总结
WeakRefs 和 Finalizers 是 ES11 中新增的两个垃圾回收相关功能,用于更好地管理内存资源。使用它们可以避免内存泄漏,提高代码效率。我们在开发过程中应该根据具体情况选择是否使用 WeakRefs 和 Finalizers。
在使用 WeakRefs 和 Finalizers 时,需要注意以下几点:
- 不要将 WeakRefs 和 Finalizers 用于所有对象,只使用于确实需要减少内存耗用的对象。
- 记得在程序中的适当时间中调用垃圾回收机制的方法,如
globalThis.gc()
。 - 尽可能避免使用 Finalizers 的软删除(Soft Deletion)模式,这可能会导致对象被保留在内存中更长时间,导致内存占用增加。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6656c069d3423812e4bb2f93