ES11 的 WeakRefs

阅读时长 3 分钟读完

在 ECMAScript 2021 (ES11)中,弱引用(WeakRefs)是一项新增的功能。弱引用提供了一种将对象引用纳入垃圾回收的方式,这意味着如果一个对象不再被任何程序引用,那么该对象将被自动删除。

弱引用是一种特殊的引用类型,它允许程序可以引用对象,但是不会阻止垃圾回收器从内存中删除这个对象。弱引用包含一个弱引用对象和一个可选的清理回调函数。当对象被垃圾回收器删除时,清理回调函数将被自动调用。这样我们就可以使用弱引用来跟踪对象生命周期,并在它们变得不再需要时自动清理内存。

创建 WeakRef 对象

要创建一个弱引用对象,我们可以使用 WeakRef 类。如下所示,它接受一个对象作为参数:

上面的代码创建了一个弱引用对象 weakRef,它引用名为 obj 的对象。现在,我们可以使用 weakRef.deref() 方法来获取被引用的对象。请注意,如果 obj 被垃圾回收器删除,weakRef.deref() 将返回 undefined

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

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

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

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

在上面的代码中,我们还使用了 gc() 函数手动运行了垃圾回收器。这是因为在大多数现代浏览器中,垃圾回收器运行的时间是不确定的,因此我们需要手动运行它来确保它已经删除了我们想要删除的对象。

创建 Clean up 回调

我们可以使用 WeakRef 构造函数中的可选参数来设置 Clean up 回调函数。如果在创建弱引用时指定了回调函数,则在被引用的对象被垃圾回收器删除时,回调函数将被自动调用。

在上面的代码中,我们定义了一个 Clean up 回调函数,它在对象被垃圾回收器删除时将打印一条消息。请注意,如果我们尝试访问被删除的对象,将会收到一个错误。

使用 WeakRef 的场景

弱引用的一个重要应用场景是跟踪对象的生命周期。当我们需要缓存大量的对象时,我们可以使用弱引用来缓存这些对象,而不用担心内存泄漏问题。当我们需要时,我们可以轻松地从缓存中获取对象,而不必担心它们是否还存在于内存中。

另一个常见的用例是使用弱引用来实现缓慢加载,例如使用弱引用来缓存页面中的图像。当使用者需要访问图片时,我们可以检查缓存中是否有相应的弱引用对象。如果对象存在,则使用 weakRef.deref() 方法获取该对象,并将其显示在页面上。如果对象不存在,则加载图像并将弱引用对象添加到缓存中。

总结

弱引用是一项非常有用的功能,它可以帮助我们解决内存泄漏问题,特别是在需要缓存大量对象的情况下。 弱引用是 JS 的一个重要方向,它将帮助开发者在缓存和 GC 等方面获得更好的控制。随着它在 JS 社区中的普及逐渐成为标准,我们相信 ES11 的弱引用将成为未来编写 JS 代码时不可或缺的工具之一。

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

纠错
反馈