当在函数内部调用函数时,事件侦听器处理程序上下文会发生什么?

时间:2019-01-08 17:58:45

标签: javascript node.js

我有一个产生子进程的方法,该子进程具有事件侦听器及其内部的处理程序。

我的问题是:

  1. 当我重新调用内部事件处理程序中的方法时,方法context(内存)会发生什么?
  2. 垃圾回收会清除方法上下文,还是将其保留在内存中直到整个应用程序存在

    import { spawn } from 'child_process';
    class SomeThing {
    initChildProcess() {
      const childProcess = spawn('go', [ 'run', 'awesome.go' ])
      // what will happen to this context
      // will garbage collector clear it?
      childProcess.once('close', () => {
        // when I re-invoked it inside this event handler?
        this.initChildProcess()
      })
     }
    }
    

1 个答案:

答案 0 :(得分:1)

使用您显示的代码,一旦您对this.initChildProcess()的内部调用返回(由于spawn()是异步的,所以很快),那么您对initChildProcess()的原始调用就完成了,该调用中的childProcess对象将处于关闭状态,并且没有其他事件侦听器(或可能发生的事件),因此可以进行垃圾收集。

  

当我重新调用内部事件处理程序中的方法时,方法上下文(内存)会发生什么?

有关垃圾收集的条件,请参见上文。显示的内容将被垃圾收集。重新调用与与原始调用关联的上下文没有任何关系。

  

垃圾回收会清除方法上下文,还是将其保留在内存中直到整个应用程序存在

它将清除它。 spawn()的第二次调用没有对第一个调用的代码引用,因此,第一个spawn()后面的本机代码完成后或没有更多事件时,第一个将有资格进行垃圾回收第一个childProcess对象上的侦听器。这将使childProcess对象无法被任何代码访问,因此有资格进行垃圾回收。