初始全局执行上下文是否从JavaScript调用堆栈中弹出?

时间:2015-04-26 15:24:22

标签: javascript ecmascript-6

"初始全局执行上下文"曾经在JavaScript中弹出调用堆栈?我在谈论堆栈底部的执行上下文。

如果是这样,我认为这意味着在从作业队列中取回回叫之前,它首先被推入堆栈?

或者,只要将回调推送到堆栈上,是[[Scope]].outer链是否提供对全局环境的访问?

1 个答案:

答案 0 :(得分:2)

  

“初始全局执行上下文”是否曾在JavaScript中从调用堆栈中弹出?我在谈论堆栈底部的执行上下文。

是的,确实如此。空执行上下文堆栈是任何jobs to run的必需品。

但是,没有像“初始全局执行上下文”这样的东西,并且由于堆栈可以为空,因此堆栈底部始终没有单个上下文。

“全局执行上下文”在ScriptEvaluations中创建。每个脚本都有自己的scriptCxt,但它们在共享领域中的所有脚本都带有相同的全局环境记录。但是,这些scriptCtx不在堆栈的底部。

位于堆栈底部的“初始执行上下文”是在ECMAScript Initialisation进程中创建的。这是毫无意义的,因为除了新领域之外它没有任何东西,只能作为initialisation of the realm and global object的上下文,但它也用于启动作业队列。

  

如果是这样,我认为这意味着在从作业队列中取回回叫之前,它首先被推入堆栈?

确实是的。我们可以从NextJob算法步骤的说明中看到这一点。这些是在ECMAScript初始化结束和每项工作结束时执行的,基本上如下:

  1. 暂停当前执行上下文并从堆栈中弹出,以便堆栈为空。
  2. 从任何队列中获取下一份工作。如果没有更多,请按照您的意愿继续(即通常关闭该过程)。
  3. 创建一个新的,空的(作业领域除外)上下文newContext并将其放在堆栈的底部
  4. 在此上下文中执行所选作业(最后从NextJob开始)
  5. 这些上下文充当每个作业的基础,包含所有发生的执行。在PromiseJobs中,它们被直接使用,而在模块和脚本评估作业中,其他上下文将被推送到堆栈上,用于保存应与其执行代码的相应环境记录。

      

    或者,它是[[Scope]]。外链,只要将回调推送到堆栈上,就可以访问全局环境吗?

    确实是的。范围链(不要与执行上下文堆栈混淆)确实提供从任何地方到全局环境的访问,该环境位于每个范围链的末尾。