Get to know MDN better
此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
WeakRef 对象允许你保留对另一个对象的弱引用,但不会阻止垃圾回收(GC)清理被弱引用的对象。
WeakRef 对象包含对对象的弱引用,这个弱引用被称为该 WeakRef 对象的 target 或者是 referent。对象的弱引用是指该引用不会阻止 GC 回收这个对象。而与此相反的,一个普通的引用(或者说强引用)会将与之对应的对象保存在内存中。只有当该对象没有任何的强引用时,JavaScript 引擎 GC 才会销毁该对象并且回收该对象所占的内存空间。如果上述情况发生了,那么你就无法通过任何的弱引用来获取该对象。
备注:在使用前请阅读尽量避免使用,对于 WeakRef 对象的使用要慎重考虑,能不使用就尽量不要使用
创建一个 WeakRef 对象
返回当前实例的 WeakRef 对象所绑定的 target 对象,如果该 target 对象已被 GC 回收则返回undefined
正确使用 WeakRef 对象需要仔细的考虑,最好尽量避免使用。避免依赖于规范没有保证的任何特定行为也是十分重要的。何时、如何以及是否发生垃圾回收取决于任何给定 JavaScript 引擎的实现。GC 在一个 JavaScript 引擎中的行为有可能在另一个 JavaScript 引擎中的行为大相径庭,或者甚至在同一类引擎,不同版本中 GC 的行为都有可能有较大的差距。GC 目前还是 JavaScript 引擎实现者不断改进和改进解决方案的一个难题。
以下是 WeakRef 提案的作者在其解释文件(explainer document)中提出的一些具体观点
垃圾回收是复杂的。如果某个应用或者库依赖于 GC 及时、可预测地清理 WeakRef 或者调用终结器的[清理回调]。那么它很可能让人失望:清理工作可能比预期晚得多,甚至根本没有。差异的来源包括:
这个例子演示了在一个 DOM 元素中启动一个计数器,当这个元素不存在时停止:
| ECMAScript® 2027 Language Specification # sec-weak-ref-objects |
启用 JavaScript 以查看此浏览器兼容性表。