返回

执行上下文和执行栈:JavaScript 代码运行的环境和组织

前端

  1. 执行上下文简介

执行上下文是评估和执行 JavaScript 代码的环境,它定义了代码的执行环境和变量的作用域。JavaScript 代码都是在执行上下文中运行的,根据代码的类型,JavaScript 中有三种执行上下文:全局执行上下文、函数执行上下文和 eval 执行上下文。

1.1 全局执行上下文

全局执行上下文是 JavaScript 程序的第一个执行上下文,它在脚本或模块被解释和执行之前创建。全局执行上下文包含所有全局变量和函数,以及 JavaScript 的内置对象,例如 ObjectFunctionMath

1.2 函数执行上下文

当一个函数被调用时,就会创建一个新的函数执行上下文。函数执行上下文包含函数的参数、局部变量和函数体内的代码。函数执行上下文的作用域链包括函数执行上下文自己的作用域、包含该函数的执行上下文的作用域,以及依次向上直到全局执行上下文的作用域。

1.3 eval 执行上下文

eval() 函数可以将字符串作为代码执行。当 eval() 函数被调用时,就会创建一个新的 eval 执行上下文。eval 执行上下文的作用域链包括 eval 执行上下文自己的作用域、调用 eval() 函数的执行上下文的作用域,以及依次向上直到全局执行上下文的作用域。

2. 执行栈

执行栈是一个先进后出的(LIFO)栈,用于存储和管理执行上下文。当一个函数被调用时,它的执行上下文会被压入执行栈中。当函数执行完毕,它的执行上下文就会从执行栈中弹出。执行栈始终包含当前正在执行的函数的执行上下文,以及包含该函数的执行上下文,依次向上直到全局执行上下文。

3. 作用域链

作用域链是一个由执行上下文组成的链,它决定了变量和函数的作用域。当 JavaScript 代码在执行上下文中执行时,它可以访问作用域链中的所有变量和函数。作用域链是从当前执行上下文开始,向上一直到全局执行上下文。

4. 变量提升

变量提升是 JavaScript 中的一个特殊行为,它会在代码执行之前将变量声明提升到作用域链的顶部。这意味着变量可以在声明之前被使用,但其值是 undefined。

5. 词法作用域和动态作用域

词法作用域是 JavaScript 的默认作用域类型,它根据代码的结构来确定变量和函数的作用域。动态作用域是一种不同的作用域类型,它根据代码的执行环境来确定变量和函数的作用域。

6. 总结

执行上下文和执行栈是 JavaScript 代码运行和组织的基础,它们对于理解 JavaScript 代码的执行机制非常重要。作用域链、变量提升、词法作用域和动态作用域等概念也与执行上下文和执行栈密切相关,它们共同构成了 JavaScript 代码执行的基础。