在 ECMAScript 2021 (ES11)中,弱引用(WeakRefs)是一项新增的功能。弱引用提供了一种将对象引用纳入垃圾回收的方式,这意味着如果一个对象不再被任何程序引用,那么该对象将被自动删除。
弱引用是一种特殊的引用类型,它允许程序可以引用对象,但是不会阻止垃圾回收器从内存中删除这个对象。弱引用包含一个弱引用对象和一个可选的清理回调函数。当对象被垃圾回收器删除时,清理回调函数将被自动调用。这样我们就可以使用弱引用来跟踪对象生命周期,并在它们变得不再需要时自动清理内存。
创建 WeakRef 对象
要创建一个弱引用对象,我们可以使用 WeakRef
类。如下所示,它接受一个对象作为参数:
const obj = {}; const weakRef = new WeakRef(obj);
上面的代码创建了一个弱引用对象 weakRef
,它引用名为 obj
的对象。现在,我们可以使用 weakRef.deref()
方法来获取被引用的对象。请注意,如果 obj
被垃圾回收器删除,weakRef.deref()
将返回 undefined
。
-- -------------------- ---- ------- --- --- - --- --- ------- - --- ------------- ----------------------------- -- ---- -- --- - ----- ----- -- --------- ----------------------------- -- -- ---------
在上面的代码中,我们还使用了 gc()
函数手动运行了垃圾回收器。这是因为在大多数现代浏览器中,垃圾回收器运行的时间是不确定的,因此我们需要手动运行它来确保它已经删除了我们想要删除的对象。
创建 Clean up 回调
我们可以使用 WeakRef
构造函数中的可选参数来设置 Clean up 回调函数。如果在创建弱引用时指定了回调函数,则在被引用的对象被垃圾回收器删除时,回调函数将被自动调用。
const obj = {}; const weakRef = new WeakRef(obj, () => console.log('清理对象: ', obj)); obj = null; gc(); // 手动运行垃圾回收器
在上面的代码中,我们定义了一个 Clean up 回调函数,它在对象被垃圾回收器删除时将打印一条消息。请注意,如果我们尝试访问被删除的对象,将会收到一个错误。
使用 WeakRef 的场景
弱引用的一个重要应用场景是跟踪对象的生命周期。当我们需要缓存大量的对象时,我们可以使用弱引用来缓存这些对象,而不用担心内存泄漏问题。当我们需要时,我们可以轻松地从缓存中获取对象,而不必担心它们是否还存在于内存中。
另一个常见的用例是使用弱引用来实现缓慢加载,例如使用弱引用来缓存页面中的图像。当使用者需要访问图片时,我们可以检查缓存中是否有相应的弱引用对象。如果对象存在,则使用 weakRef.deref()
方法获取该对象,并将其显示在页面上。如果对象不存在,则加载图像并将弱引用对象添加到缓存中。
总结
弱引用是一项非常有用的功能,它可以帮助我们解决内存泄漏问题,特别是在需要缓存大量对象的情况下。 弱引用是 JS 的一个重要方向,它将帮助开发者在缓存和 GC 等方面获得更好的控制。随着它在 JS 社区中的普及逐渐成为标准,我们相信 ES11 的弱引用将成为未来编写 JS 代码时不可或缺的工具之一。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64d444f9b5eee0b525bc7a4b