2

ECMAScript 6 引入了弱映射,在 Node.JS v0.11.3 中使用 flag 实现--harmony

考虑以下代码。

var weakMap = WeakMap();
var temp = {};
weakMap.set(temp, 'Save me!');
temp = {};

执行最后一行时,该字符串'Save me!'已准备好进行垃圾回收。是否可以用代码证明该字符串不再具有从当前范围指向它的强引用链?

我知道弱地图没有迭代或size类似于地图的属性。这是否意味着无法后验地知道给定对象不再可以从弱映射中访问?

4

1 回答 1

1

你不能,因为这样做没有意义。如果您无法到达某物,则没有很好的方法来询问它是否可以到达。如果有一个函数

isStronglyReachable(foo)

那你怎么把它传递给不可到达的foo?没有办法将弱引用传递给它foo,如果你foo直接传递,那么你知道它是强可访问的,因为你只是使用了对它的强引用(并将它绑定到一个参数会创建另一个或两个强引用)。您可以尝试以下形式

weakmap.isValueStronglyReachable(key)

但随后您需要对密钥的强引用,这将使该值非常容易达到。即使您尝试了某种形式

weakmap.getArrayOfUnreachableKeys()

(这将使返回的对象可以通过返回的数组访问),运行时必须运行完整的 GC 传递来确定哪些值是不可访问的 - 如果它正在执行 GC 传递,为什么不只是删除条目无法访问的键?

于 2013-07-09T01:21:27.920 回答