Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这个函数可以被垃圾回收吗?_Javascript_Node.js_Garbage Collection_V8 - Fatal编程技术网

Javascript 这个函数可以被垃圾回收吗?

Javascript 这个函数可以被垃圾回收吗?,javascript,node.js,garbage-collection,v8,Javascript,Node.js,Garbage Collection,V8,想想这块蛋糕吧。。。ehm,代码: '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...

想想这块蛋糕吧。。。ehm,代码:

'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调用,因为承诺保留了对它的引用,但是一旦承诺的主体完成并将执行上下文返回到上(?)范围,堆栈就会展开(因为这里没有更多要执行的语句),承诺就变得不可访问,因此是垃圾收集

    你能确认我对这个话题的理解是正确的吗

    我如何根据经验观察这种行为?换言之,我如何监控哪些对象正在被GC捕获以及何时被GC捕获?如果这有什么不同的话,我纯粹是在Node.js中开发的

  • 如果
    Promise
    对象没有指向它的引用,那么它是可收集的。 如果使用了
    doWork()。则(…)
    将创建一个临时引用。因此,直到
    。然后
    不再阻塞,因为存在对对象的引用,因此无法收集该对象
  • 没错,
    doMoreWork
    也是不可收集的,因为
    Promise
    对象有一个对它的引用
  • 语句
    doWork()。然后(…)
    可以替换为

    new Promise(function (resolve, reject) {
      // work work work...
    }).then(function doMoreWork () {
              // Some more work to do...
            })
    
    因此,您可以想象您正在直接使用
    Promise
    对象,因此“上限”范围是使用对象的地方


    对象通常在没有更多引用时收集。即使代码在承诺中,它也只是一个对象,并且对
    的调用被链接,因此正在使用该对象

    没有任何东西保持对承诺的引用,因此它将被垃圾收集。promise是唯一保留对函数
    doMoreWork
    引用的东西,因此它也将被垃圾收集

    我怎么能凭经验观察这种行为?换言之,我如何监控正在对哪些对象执行GC操作以及何时执行GC操作?如果这有什么不同的话,我纯粹是在Node.js中开发的


    V8中的GC不一定收集对象。例如,如果这是您的整个程序,那么首先运行任何GC都是浪费时间。

    要查看对象是否可以垃圾回收,您可以创建一个测试并查找内存泄漏(通过任务管理器)。如果您的代码编写正确,所有内容都会被收集。

    您的意思是您的工作从不调用
    resolve()
    ?是的,在这种情况下,gc会立即怀疑您的所有对象。我认为Esailija的答案应该是正确的,但如果不知道Promise的实现,就无法证明它。创建承诺,对其执行单个.then()调用,然后,根据代码,它是未使用的,因此承诺和then()的参数都可以循环使用。但是,如果您的承诺实现保留了某种内部列表或创建的承诺表,该怎么办?也许解决了问题,他们就可以自由了;也许永远不会。我的猜测是,他们不会以这种方式编写承诺实现;但是没有证据。不管怎样,你的JS程序都无法区分两者之间的区别。