ECMAScript 2021 (ES12) 中 WeakRef 和 FinalizationRegistry 详解

阅读时长 3 分钟读完

在 ECMAScript 2021 (ES12) 中,引入了两个新的原生 API:WeakRefFinalizationRegistry。这两个 API 都是为了更好地支持内存管理而设计的。

WeakRef

WeakRef 是一种对象引用,它不会阻止其引用对象被垃圾回收。当其引用对象被垃圾回收时,WeakRef 会自动失效。

使用 WeakRef 时,需要先创建一个 WeakRef 对象,然后通过其 deref() 方法获取原对象的引用。在获取原对象引用后,应该立即使用该引用,因为该引用可能在任何时候都会被自动失效。

下面是一个使用 WeakRef 的示例代码:

-- -------------------- ---- -------
-- -------
----- --- - - ----- ------ --

-- ---- ------- --
----- ------- - --- -------------

-- -------
----- --- - ----------------

-- -------
-- ----- -
  ---------------------- -- ---------
-

在上面的示例代码中,weakObj.deref() 返回的引用可能为 undefined,因此需要先使用 if (ref) 来检查引用是否存在。

FinalizationRegistry

FinalizationRegistry 是一种回调机制,用来在垃圾回收时自动执行一些代码。与 WeakRef 类似,FinalizationRegistry 也不会阻止其注册对象被垃圾回收。

使用 FinalizationRegistry 时,需要先创建一个 FinalizationRegistry 对象,并使用其 register() 方法注册一个对象和回调函数。在注册的对象被垃圾回收时,FinalizationRegistry 会自动调用回调函数,并将被回收对象的引用和注册时传入的后续值作为参数传入回调函数中。

下面是一个使用 FinalizationRegistry 的示例代码:

-- -------------------- ---- -------
-- ---- -------------------- --
----- -------- - --- -------------------------------- -- -
  ------------------------- -----------
---

-- ------
----- --- - - ----- ------ --

-- ----- --------------------
---------------------- -------

-- ----
--- - -----

在上面的示例代码中,当 obj 对象被垃圾回收时,FinalizationRegistry 调用了回调函数,并将 "foo" 作为参数传入该回调函数中。

总结

WeakRefFinalizationRegistry 是 ECMAScript 2021 中新增的重要 API,它们提供了更好的内存管理功能,可以有效地避免内存泄漏和提高性能。在使用时,需要了解其基本原则和注意事项,才能正确有效地使用这两个 API。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64fd146395b1f8cacdcb9253

纠错
反馈