ES10:WeakRef 和 FinalizationRegistry

阅读时长 4 分钟读完

ES10:WeakRef 和 FinalizationRegistry

在编写 JavaScript 应用程序时,通常需要追踪对象是否被急切地需要,以便它们可以被垃圾回收或释放。ES10 引入了 WeakRef 和 FinalizationRegistry,这两个新 API 提供了更好的垃圾收集机制,使开发人员能够更好地管理他们的内存管理。

Weak Reference

先来看一下 Weak Reference 是什么。Weak Reference 是一种可以跟踪对象但不会阻止该对象被垃圾回收的引用类型。这意味着 Weak Reference 可以防止循环引用,同时也可以在对象不再需要时释放它们。

Weak Reference 通过 WeakRef 类型来实现。在使用它时,我们需要先创建一个对象,可以是任何 JS 对象,然后将其传递给 WeakRef() 构造函数。示例代码如下:

在上面的代码中,我们创建了一个名为 someObject 的对象,并将其传递给 WeakRef() 构造函数。我们可以使用 deref() 方法来检索原始对象,并检查其是否仍在内存中。

但请注意,这里的姿势不正确:

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

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

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

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

-

-------

由于 weakRef 在 test() 函数中声明,因此当函数返回时,将不再存在该引用,也不再保留有关对象不再引用的详细信息。因此,Weak Reference 将成为无效引用,不再可用,也不会阻止其对象被垃圾回收。

Finalization Registry

Weak Reference 可以帮我们在释放对象时执行特定的操作,但有时我们的应用程序需要一个更全面的机制来控制垃圾收集。这时候,我们就需要使用 Finalization Registry。

Finalization Registry 提供了一个中心位置来注册需要在对象被 GC 时调用的清理回调,以及一些编写日志以跟踪对象生命周期操作的方法。Finalization Registry 类型的实例包含一个属性,指向 WeakMap 对象以跟踪需要进行跟踪处理的 Weak Reference。

Finalization Registry 的原理非常简单。每当 Weak Reference 所引用的对象被 GC 时,它们的键值将自动从关联的 WeakMap 中删除。与此同时,任何使用了该键的回调函数也会被调用。

下面是 Finalization Registry 的示例代码:

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

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

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

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

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

在上面的代码中,我们创建了 FinalizationRegistry 对象并向其中注册了一个回调函数。在后面的代码中,我们将注册 obj 对象,然后删除 obj 的所有引用,例如将其设置为 null。然后,我们手动触发垃圾回收,以此来模拟对象被 GC。在这个过程中,与 obj 相关联的 Weak Reference 变为无效,从 Finalization Registry 中删除。

总结

Weak Reference 和 Finalization Registry 对于管理 JavaScript 程序中的内存非常有用。他们提供了更好的控制方法,以更好地管理程序中的对象。虽然这两个 API 不是必需的功能,但在需要访问大量对象的大型应用程序中,他们可以帮助程序员更好地管理他们的对象,最终使他们的代码更加可读和可维护。

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

纠错
反馈