ES9 之 WeakRef 与 FinalizationRegistry 详解

随着前端技术的不断发展,JavaScript 也在不断更新,ES9 引入了 WeakRef 和 FinalizationRegistry 两个重要的 API,这两个 API 对于前端程序员来说具有重要的意义。本文将详细介绍它们的作用、使用方法和示例代码。

WeakRef

WeakRef 是 ES9 中引入的新类型,它用于表示对一个对象的弱引用。与普通引用不同,当一个对象被弱引用时,它不会阻止垃圾回收器回收它。也就是说,如果一个对象只被一个弱引用所持有,则该对象可能会被回收。

在 JavaScript 中,我们经常需要绑定事件、添加计时器等操作,这些操作都会创建一个闭包,使得被绑定的元素或计时器无法被垃圾回收。而使用 WeakRef 可以避免这种情况,从而提高内存使用效率。

WeakRef 的 API 有两个方法:

  • deref():用于获取被弱引用的对象,如果该对象已经被回收,则返回 undefined
  • constructor(target: T):创建一个对目标对象 target 的弱引用。

以下是示例代码:

FinalizationRegistry

FinalizationRegistry 是 ES9 中引入的新类型,它用于在垃圾回收对象时执行指定的回调函数。与 WeakRef 不同,FinalizationRegistry 处理的是被垃圾回收的对象,并执行相应的回调函数。

FinalizationRegistry 的 API 有三个方法:

  • constructor(cleanupCallback: (target: T) => void):创建一个 FinalizationRegistry,指定回调函数 cleanupCallback,它会在对象被回收时执行。
  • register(target: T, heldValue: any, unregisterToken?: object): void:将对象 target 注册到 FinalizationRegistry 中,并指定额外传递给回调函数的参数 heldValue,同时返回一个 unregisterToken
  • unregister(unregisterToken: object): void:删除注册时返回的 unregisterToken

以下是示例代码:

在上述代码中,当对象 object 被垃圾回收时,该对象的 ID 会被打印出来。

总结

WeakRef 和 FinalizationRegistry 是 ES9 中新增的两个 API,它们可以更好地处理内存回收问题,提高代码效率和性能。在写 JavaScript 代码时,应该尽可能使用它们来避免造成内存泄漏等问题。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653f7c637d4982a6eb90dc0e


纠错
反馈