javascript何时违反承诺或对象被垃圾回收

时间:2019-01-28 12:53:45

标签: javascript google-chrome promise garbage-collection closures

我正在测试(?<!月|\d)\d+日(?!后) promises,根据此article,像下面代码中显示的garbage collection应该得到promise。我使用了garbage collected进行检查,因为它不会干扰GC。

WeakMap

我在chrome中测试了上面的代码,该地图仍然引用了promise。我对var map = new WeakMap(); map.set(new Promise(function() {}), "test"); function doCheck() { console.log(map); }类的理解是否错误?如果没有,为什么诺言没有被GC化?

1 个答案:

答案 0 :(得分:1)

大多数Javascript引擎使用标记扫描算法来检查是否需要对对象进行垃圾收集。

  

此算法假设了解一组称为根的对象   (在JavaScript中,根是全局对象)。定期   垃圾收集器将从这些根开始,找到所有   从这些根目录中引用,然后从中引用所有对象   这些等等。从根开始,垃圾收集器将因此   找到所有可到达的对象并收集所有不可到达的对象。

此外,地图对象还弱地保留了对对象的引用。并且没有其他引用promise对象,JS引擎应该在下一个垃圾回收周期中清除promise对象。

当我第一次调用doCheck()时,map引用了promise。但是当我第二次调用时,它是空的。

enter image description here