JS 执行过程:执行上下文、词法环境
Eijux(讨论 | 贡献)2023年4月17日 (一) 18:12的版本 (创建页面,内容为“category:JavaScript == 执行上下文(Execution Contexts) == <big>'''执行上下文(Execution Contexts)'''</big>:是评估和执行 JavaScript 代码的环境的抽象概念 —— JavaScript 代码都需要运行在相应的“执行上下文”中 执行上下文一共有三种类型: # <span style="color: green">'''全局执行上下文'''</span>:基础的上下文,任何不在函数内部的代码都在其中。 #: 它会执行两…”)
执行上下文(Execution Contexts)
执行上下文(Execution Contexts):是评估和执行 JavaScript 代码的环境的抽象概念 —— JavaScript 代码都需要运行在相应的“执行上下文”中
执行上下文一共有三种类型:
- 全局执行上下文:基础的上下文,任何不在函数内部的代码都在其中。
- 它会执行两件事:创建一个全局的 window 对象(浏览器的情况下),并且设置 this 的值等于这个全局对象。
- 程序首次允许时创建 —— 一个程序中只会有一个全局执行上下文。
- 函数执行上下文:函数内部的代码所在的上下文。
- 每次函数被调用都会创建一个新的执行上下文 —— 同一函数的多次执行,会多个上下文
- eval执行上下文:eval() 内部的代码所在的执行上下文
- 使用“eval方法”时创建
“执行上下文”定义了代码执行时的环境、作用域和数据流等重要属性,包括变量对象(Variable Object)、作用域链(Scope Chain)、this 指向和函数参数等信息。 每个脚本、函数的“执行”都会创建一个新的“执行上下文”;
执行上下文栈
执行上下文栈(Execution context stack,ECS):又称“调用栈 / 执行栈”(call stack),用于管理“执行上下文”
函数的“执行过程”就是:对应的“执行上下文”(栈帧)在“调用栈”中的“入栈”(开始执行)、“出栈”(执行完毕)操作。
示例:
let a = 'Hello World!'; function first() { console.log('Inside first function'); second(); console.log('Again inside first function'); } function second() { console.log('Inside second function'); } first(); console.log('Inside Global Execution Context');