考虑一下这块蛋糕......呃,代码:
'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-ed的对象以及何时?我完全在Node.js中开发,如果这有任何区别的话。
答案 0 :(得分:3)
没有什么可以保留对诺言的引用,因此它将被垃圾收集。承诺是唯一保留对函数doMoreWork
的引用,因此它也将被垃圾收集。
我怎么能凭经验观察这种行为?换句话说,我如何监控哪些对象正在进行GC编辑?何时?我纯粹在Node.js中开发,如果这有任何区别。
V8中的GC不一定会收集对象。例如,如果这是您的整个程序,那么首先运行任何GC都会浪费时间。
答案 1 :(得分:0)
Promise
对象没有指向它的引用,则它是可收集的。
如果使用doWork().then(...)
,则会创建临时引用。因此,在.then
不再阻止之前,会有对该对象的引用,因此无法收集它doMoreWork
也不可收集,因为Promise
对象有一个对它的引用语句doWork().then(...)
可以替换为
new Promise(function (resolve, reject) {
// work work work...
}).then(function doMoreWork () {
// Some more work to do...
})
所以你可以想象你直接使用Promise
对象,所以" Upper" -Scope是使用对象的地方。
通常在没有对象的引用时收集对象。即使代码在Promise中,它只是一个对象,并且对then
的调用是链接的,因此正在使用该对象
答案 2 :(得分:0)
要查看某个对象是否可以进行垃圾收集,您可以创建一个测试并查找内存泄漏(通过任务管理器)。如果你的代码写得正确,一切都会被收集。