全局执行上下文是否与JavaScript中的全局对象相同?

问题描述 投票:2回答:1

据我所知,每次JavaScript程序开始运行时,引擎都会首先创建一个执行上下文,将该执行上下文推入调用堆栈/执行堆栈,然后创建一个全局对象(浏览器中的窗口和节点)。

要创建执行上下文,引擎首先进入创建阶段,在该阶段,引擎在内存中为整个函数定义和变量声明(提升)分配空间。它维护对外部作用域的引用(这会创建作用域链,但在全局执行上下文中没有任何内容),并且还在执行上下文中创建this属性并将其设置为window对象在浏览器中,并在Node.modules.exports中导出。最后,引擎然后进入执行阶段,在该阶段逐行执行代码并为每个变量分配一个值。

我是否正确区分全局执行上下文的创建和全局对象本身的创建?我将它们都视为并排执行的操作,但它们并非完全相同。

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

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

请注意,“执行上下文”主要是一个抽象概念,这意味着引擎只需按照规范描述的方式“表现为”即可。高性能引擎可能会采用某些快捷方式(例如,优化的代码可能会将某些局部变量保留在寄存器或机器堆栈中,而根本不会将其置于任何上下文中)。

© www.soinside.com 2019 - 2024. All rights reserved.