这个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的构造函数中的函数完成…
-
Promise
对象是垃圾回收对象吗? -
doMoreWork()
垃圾回收的吗?
我的猜测是doMoreWork()
不能直接进行GC编辑,因为Promise保留了对它的引用,但是一旦promise的主体完成并将执行上下文返回到上层(?)作用域,栈就会展开(因为没有更多声明在这里执行),Promise变得无法访问,因此被垃圾收集。
你能证实我对这个话题的理解是正确的吗?
我怎么能凭经验观察这种行为? 换句话说,我该如何监控哪些对象正在进行GC编辑以及何时? 我纯粹在Node.js中开发,如果这有什么区别的话。
没有任何参考的承诺,所以它会被垃圾收集。 承诺是唯一保持对函数doMoreWork
引用,所以它也会被垃圾收集。
我怎么能凭经验观察这种行为? 换句话说,我该如何监控哪些对象正在进行GC编辑以及何时? 我纯粹在Node.js中开发,如果这有什么区别的话。
V8中的GC不一定会收集一个对象。 例如,如果这是你的整个程序,首先运行GC是浪费时间。
- 如果
Promise
对象没有指向它的引用,它是可收集的。 如果使用了doWork().then(...)
会创build一个临时引用。 所以直到。然后不再阻塞的时候才有对象的引用,所以不能被收集 - 你是对的,
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理器)。 如果你的代码写得不错,一切都被收集起来。