在 ECMAScript 2021 (ES12) 中,引入了两个新的原生 API:WeakRef
和 FinalizationRegistry
。这两个 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"
作为参数传入该回调函数中。
总结
WeakRef
和 FinalizationRegistry
是 ECMAScript 2021 中新增的重要 API,它们提供了更好的内存管理功能,可以有效地避免内存泄漏和提高性能。在使用时,需要了解其基本原则和注意事项,才能正确有效地使用这两个 API。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64fd146395b1f8cacdcb9253