首页 > 解决方案 > 我可以认为 JavaScript 的 WeakMap 中的值是弱可达的吗?

问题描述

如果我在 javascript 中有两个 WeakMap:

/**
 * @type {WeakMap.<Function, Provider>}
 */
const providerFtn = new WeakMap();

/**
 * @type {WeakMap.<Provider, Function>}
 */
const provider = new WeakMap();

我在 WeakMaps 中放置了一个 Provider 及其功能...

function registerThingProvider(title, params) {
  const myProvider = new Provider(title);
  function factory() { new Thing(params); }

  providerFtn.set(factory, myProvider);
  provider.set(myProvider, factory);

  return myProvider;
}

let stronglyReachableProvider = registerThingProvider('fooBar', [ 3.14, null ]);

在这一点上,我希望提供者和它的功能都是强可达的。我的假设是,一个强可达的键会使它自己和它的值都不能用于垃圾回收。providerFtn和中的引用provider应该是安全的。

但是,如果我与我的提供者一起做了一堆重要的工作,然后清除我唯一的强stronglyReachableProvider参考......

await importantWork(stronglyReachableProvider);
stronglyReachableProvider = null;

假设没有对 WeakMaps 之外的对象的其他强引用。现在是否有myProvider资格factory进行垃圾收集?在这种情况下,如果 WeakMaps 中的值引用被认为是弱可达的,那就太好了,但我怀疑 WeakMap 值必然需要作为强引用来实现。

标签: javascriptgarbage-collectionstandardsspecificationsweakmap

解决方案


推荐阅读