随着 JavaScript 语言的发展,越来越多的新特性被加入到 ECMAScript 中。在 ECMAScript 2020(ES11)中,我们看到了两个重要的新特性:WeakRefs 和 FinalizationRegistry。这两个特性都与垃圾回收有关,可以帮助我们更好地管理内存和资源。
WeakRefs
在 JavaScript 中,当一个对象不再被引用时,它会被垃圾回收器自动回收。但是,有时候我们需要在对象被回收之前执行一些清理操作。在以前,我们只能使用手动引用计数的方式来实现这个功能,但这种方式很容易出错并且不够灵活。
现在,我们可以使用 WeakRefs 来实现这个功能。WeakRefs 是一种弱引用,它不会阻止被引用对象被垃圾回收器回收。同时,我们可以通过 WeakRefs 获取到被引用对象的引用,并在对象被回收之前执行一些清理操作。
下面是一个示例代码:
----- ------ - - ----- ------ -- ----- --- - --- ---------------- ------------------------- -- - ----- ------ - ------ - ----- -- -- ------ ----- ------------------------- -- ----
在这个示例中,我们创建了一个名为 target
的对象,并将其传递给了一个 WeakRef 对象 ref
。我们可以使用 ref.deref()
方法来获取到 target
对象的引用。当 target
对象被回收后,ref.deref()
方法将返回 null
。
FinalizationRegistry
除了 WeakRefs,ECMAScript 2020(ES11)中还引入了 FinalizationRegistry。FinalizationRegistry 可以用来注册一个回调函数,在对象被垃圾回收之前执行一些清理操作。与 WeakRefs 不同的是,FinalizationRegistry 可以跟踪多个对象,并在它们被垃圾回收之前执行回调函数。
下面是一个示例代码:
----- -------- - --- ---------------------------- -- - ------------------- ---- -- ----------- --- ---- ------- ------------ --- --- ---- - - --- - -- --- ---- - - --- - -- ----------------------- - --- - --- ----------------------- - --- - --- ---- - ----- -- -- ---- ----- ------------- -- - -- -- -------- --------- ---- - ----- -- -- ---- ----- -- ------
在这个示例中,我们创建了一个 FinalizationRegistry 对象 registry
,并向其中注册了两个对象 obj1
和 obj2
。我们可以通过 registry.register()
方法来注册一个对象,并在第二个参数中传递一些元数据。当对象被垃圾回收之前,registry
中的回调函数将会被执行,并且可以通过回调函数的参数获取到元数据。
总结
ECMAScript 2020(ES11)中的 WeakRefs 和 FinalizationRegistry 是两个非常重要的新特性,它们可以帮助我们更好地管理内存和资源。使用 WeakRefs,我们可以在对象被回收之前执行一些清理操作;使用 FinalizationRegistry,我们可以在多个对象被垃圾回收之前执行一些回调函数。这些特性都非常有深度和学习以及指导意义,希望大家能够深入了解并在实际项目中应用。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/668059f2dc1ed1a61bf1a8a1