【问题标题】:Is the global execution context the same as the global object in JavaScript?全局执行上下文是否与 JavaScript 中的全局对象相同?
【发布时间】:2020-04-17 14:58:35
【问题描述】:

据我了解,每次 JavaScript 程序开始运行时,引擎首先创建一个执行上下文,将该执行上下文推送到调用堆栈/执行堆栈中,然后创建一个全局对象(浏览器中的窗口和全局在 Node 中)也是如此。

为了创建执行上下文,引擎首先经过创建阶段,在此阶段它为整个函数定义和变量声明(提升)分配内存空间。它维护对外部作用域的引用(这会创建作用域链,但在全局执行上下文中,它上面没有任何东西),它还在执行上下文中创建this 属性并将其设置为窗口对象在浏览器和 Node.js 中的 module.exports 中。最后,引擎进入执行阶段,逐行执行代码并为每个变量赋值。

我将全局执行上下文的创建与全局对象本身的创建区分开来是否正确?我将它们视为并行发生但并不完全相同的操作。

【问题讨论】:

标签: javascript scope v8


【解决方案1】:

是的,可以公平地说,全局上下文和全局对象是独立的概念。一个说明区别是this 绑定:上下文定义this 所指的内容(在全局上下文的情况下:指向全局对象);而全局对象没有名为“this”的属性。

同时,全局上下文和全局对象在某种程度上是耦合的,因为前者中的局部变量是后者的属性。

请注意,“执行上下文”主要是一个抽象概念,这意味着引擎只需表现得“好像”它按照规范描述的那样行事。高性能引擎可能会采用某些捷径(例如,优化的代码可能会将一些局部变量保留在寄存器或机器堆栈中,根本不会将它们放入任何上下文中)。

【讨论】: