是否可以在javascript中创建"弱引用"?

Ste*_*gle 88 javascript weak-references

在javascript中是否有任何方法可以创建另一个对象的"弱引用"?这是描述弱引用的维基页面. 这是另一篇用Java描述它们的文章.谁能想到在javascript中实现这种行为的方法?

bob*_*nce 38

JavaScript中的weakrefs没有语言支持.您可以使用手动引用计数自行滚动,但不是特别顺利.您无法创建代理包装器对象,因为在JavaScript对象中永远不知道它们何时会被垃圾收集.

因此,您的"弱引用"在简单查找中成为一个键(例如整数),使用add-reference和remove-reference方法,并且当不再有手动跟踪引用时,可以删除条目,以便将来查找该键返回null.

这不是一个真正的弱点,但它可以解决一些相同的问题.它通常在复杂的Web应用程序中完成,以防止在DOM节点或事件处理程序与与之关联的对象(如闭包)之间存在引用循环时,浏览器(通常是IE,尤其是旧版本)的内存泄漏.在这些情况下,甚至可能不需要完整的参考计数方案.

  • 它仍然是正确的,因为ES6 WeakMaps不是真正的弱引用.WeakMaps仅接受对象作为键,并且对这些对象的引用保持弱.请参阅http://stackoverflow.com/questions/32397729/partial-garbage-collection-of-objects-possible-server-side-js (9认同)
  • 我没有仔细检查(或使用过)代码,但es-lab有一个提供基本[WeakMap仿真]的脚本(http://code.google.com/p/es-lab/source/browse/trunk/src /ses/WeakMap.js).[Aurora 6](http://hacks.mozilla.org/2011/05/aurora-6-is-here/)(Mozilla)有一个非标准的[WeakMap实现](https://developer.mozilla.org/EN/JavaScript的/参考/ Global_Objects/WeakMap). (2认同)
  • 使用ES6,这个答案不再正确.请参阅下面的答案http://stackoverflow.com/a/28567560/745190 (2认同)

Sch*_*lle 14

在NodeJS上运行JS时,您可以考虑https://github.com/TooTallNate/node-weak.


M. *_*rog 13

更新:2019 年 9 月

目前还不可能使用弱引用,但很可能很快就会成为可能,因为JavaScript 中的WeakRefs正在开发中。详情如下。

提议

现在处于第 3 阶段的提案,这意味着它具有完整的规范,进一步的改进将需要来自实现和用户的反馈。

WeakRef提案涵盖的功能两大新作品:

  • 使用WeakRef 类创建对对象的弱引用
  • 在对象被垃圾收集后运行用户定义的终结器,使用FinalizationGroup 类

用例

一个主要用途为弱引用是实现高速缓存或映射举办大型的物体,在它的希望,因为它出现在高速缓存或映射一个大对象没有保持活着只。

终结是在程序执行无法访问的对象之后执行代码以进行清理。用户定义的终结器启用了几个新用例,并且可以在管理垃圾收集器不知道的资源时帮助防止内存泄漏。

来源和进一步阅读

https://github.com/tc39/proposal-weakrefs
https://v8.dev/features/weak-references


Pet*_*ore 5

2021 年更新

WeakRef现已在 Chrome、Edge 和 Firefox 中实现。仍在等待 Safari 和其他一些坚持不懈的人。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef

2021 年 5 月更新 现在可在 Safari 以及所有主要浏览器上使用。往上看。