执行上下文和执行栈:JavaScript 代码运行的环境和组织
2024-01-31 22:46:06
- 执行上下文简介
执行上下文是评估和执行 JavaScript 代码的环境,它定义了代码的执行环境和变量的作用域。JavaScript 代码都是在执行上下文中运行的,根据代码的类型,JavaScript 中有三种执行上下文:全局执行上下文、函数执行上下文和 eval 执行上下文。
1.1 全局执行上下文
全局执行上下文是 JavaScript 程序的第一个执行上下文,它在脚本或模块被解释和执行之前创建。全局执行上下文包含所有全局变量和函数,以及 JavaScript 的内置对象,例如 Object
、Function
和 Math
。
1.2 函数执行上下文
当一个函数被调用时,就会创建一个新的函数执行上下文。函数执行上下文包含函数的参数、局部变量和函数体内的代码。函数执行上下文的作用域链包括函数执行上下文自己的作用域、包含该函数的执行上下文的作用域,以及依次向上直到全局执行上下文的作用域。
1.3 eval 执行上下文
eval()
函数可以将字符串作为代码执行。当 eval()
函数被调用时,就会创建一个新的 eval 执行上下文。eval 执行上下文的作用域链包括 eval 执行上下文自己的作用域、调用 eval()
函数的执行上下文的作用域,以及依次向上直到全局执行上下文的作用域。
2. 执行栈
执行栈是一个先进后出的(LIFO)栈,用于存储和管理执行上下文。当一个函数被调用时,它的执行上下文会被压入执行栈中。当函数执行完毕,它的执行上下文就会从执行栈中弹出。执行栈始终包含当前正在执行的函数的执行上下文,以及包含该函数的执行上下文,依次向上直到全局执行上下文。
3. 作用域链
作用域链是一个由执行上下文组成的链,它决定了变量和函数的作用域。当 JavaScript 代码在执行上下文中执行时,它可以访问作用域链中的所有变量和函数。作用域链是从当前执行上下文开始,向上一直到全局执行上下文。
4. 变量提升
变量提升是 JavaScript 中的一个特殊行为,它会在代码执行之前将变量声明提升到作用域链的顶部。这意味着变量可以在声明之前被使用,但其值是 undefined。
5. 词法作用域和动态作用域
词法作用域是 JavaScript 的默认作用域类型,它根据代码的结构来确定变量和函数的作用域。动态作用域是一种不同的作用域类型,它根据代码的执行环境来确定变量和函数的作用域。
6. 总结
执行上下文和执行栈是 JavaScript 代码运行和组织的基础,它们对于理解 JavaScript 代码的执行机制非常重要。作用域链、变量提升、词法作用域和动态作用域等概念也与执行上下文和执行栈密切相关,它们共同构成了 JavaScript 代码执行的基础。