这个function可以被垃圾收集吗?

考虑一下这个蛋糕…嗯,代码:

'use strict' function doWork () { return new Promise(function (resolve, reject) { // work work work... // Done! But... where's the resolve() ??? }) } doWork().then(function doMoreWork () { // Some more work to do... }) 

一旦Promise的构造函数中的函数完成…

  1. Promise对象是垃圾回收对象吗?
  2. doMoreWork()垃圾回收的吗?

我的猜测是doMoreWork()不能直接进行GC编辑,因为Promise保留了对它的引用,但是一旦promise的主体完成并将执行上下文返回到上层(?)作用域,栈就会展开(因为没有更多声明在这里执行),Promise变得无法访问,因此被垃圾收集。

你能证实我对这个话题的理解是正确的吗?

我怎么能凭经验观察这种行为? 换句话说,我该如何监控哪些对象正在进行GC编辑以及何时? 我纯粹在Node.js中开发,如果这有什么区别的话。

没有任何参考的承诺,所以它会被垃圾收集。 承诺是唯一保持对函数doMoreWork引用,所以它也会被垃圾收集。

我怎么能凭经验观察这种行为? 换句话说,我该如何监控哪些对象正在进行GC编辑以及何时? 我纯粹在Node.js中开发,如果这有什么区别的话。

V8中的GC不一定会收集一个对象。 例如,如果这是你的整个程序,首先运行GC是浪费时间。

  1. 如果Promise对象没有指向它的引用,它是可收集的。 如果使用了doWork().then(...)会创build一个临时引用。 所以直到。然后不再阻塞的时候才有对象的引用,所以不能被收集
  2. 你是对的, doMoreWork也是不可收集的,因为Promise对象有一个引用

语句doWork().then(...)可以被replace

 new Promise(function (resolve, reject) { // work work work... }).then(function doMoreWork () { // Some more work to do... }) 

所以你可以想象你直接使用Promise对象,所以“Upper”-Scope是对象被使用的地方。

通常在没有更多引用的情况下收集对象。 即使代码在Promise中,它也只是一个对象, then调用这个对象,所以这个对象被使用了

若要查看某个对象是否可以收集垃圾,可以创build一个testing并查找内存泄漏(通过任务pipe理器)。 如果你的代码写得不错,一切都被收集起来。