JavaScript 执行上下文与执行栈详解
2023-12-16 21:31:20
JavaScript 是一种单线程、事件驱动的编程语言,它在运行时创建一个执行上下文,并将代码放入执行栈中执行。执行上下文包含当前正在执行的函数、变量和对象,而执行栈是一个后进先出(LIFO)数据结构,它存储着当前正在执行的函数调用。
在 ES3 中,执行上下文是全局作用域和函数作用域。全局作用域是脚本的最外层,它包含所有在脚本中声明的变量和函数。函数作用域是函数内部的代码块,它包含在函数中声明的变量和函数。
在 ES6 中,执行上下文除了全局作用域和函数作用域之外,还增加了块级作用域。块级作用域是使用 let 和 const 声明的变量和函数的作用域。块级作用域只在声明它们的块内有效。
执行栈是一个后进先出(LIFO)数据结构,它存储着当前正在执行的函数调用。当一个函数被调用时,它会被压入执行栈中。当函数执行完毕后,它会被从执行栈中弹出。
执行上下文和执行栈是 JavaScript 程序执行的基础,理解它们对于理解 JavaScript 的运行机制非常重要。
执行上下文
执行上下文是 JavaScript 程序执行的环境,它包含当前正在执行的函数、变量和对象。执行上下文分为全局执行上下文和函数执行上下文。
- 全局执行上下文
全局执行上下文是脚本的最外层,它包含所有在脚本中声明的变量和函数。全局执行上下文在脚本开始执行时被创建,并在脚本执行完毕后被销毁。
- 函数执行上下文
函数执行上下文是函数内部的代码块,它包含在函数中声明的变量和函数。函数执行上下文在函数被调用时被创建,并在函数执行完毕后被销毁。
每个执行上下文都有自己的变量对象和作用域链。变量对象存储着在该执行上下文中声明的变量和函数。作用域链是一个指针链,它指向当前执行上下文及其父执行上下文的变量对象。
执行栈
执行栈是一个后进先出(LIFO)数据结构,它存储着当前正在执行的函数调用。当一个函数被调用时,它会被压入执行栈中。当函数执行完毕后,它会被从执行栈中弹出。
执行栈总是指向当前正在执行的函数的执行上下文。当一个函数被调用时,它的执行上下文会被压入执行栈中,并且执行栈会指向该执行上下文。当函数执行完毕后,它的执行上下文会被从执行栈中弹出,并且执行栈会指向该执行上下文的父执行上下文。
执行过程
JavaScript 程序的执行过程如下:
- 创建全局执行上下文。
- 将脚本中的代码放入全局执行栈中。
- 开始执行全局执行栈中的代码。
- 当遇到函数调用时,将函数的执行上下文压入执行栈中。
- 开始执行函数的执行栈中的代码。
- 当函数执行完毕后,将函数的执行上下文从执行栈中弹出。
- 继续执行全局执行栈中的代码。
- 当全局执行栈中的代码执行完毕后,脚本执行结束。
总结
执行上下文和执行栈是 JavaScript 程序执行的基础,理解它们对于理解 JavaScript 的运行机制非常重要。
执行上下文包含当前正在执行的函数、变量和对象。执行栈是一个后进先出(LIFO)数据结构,它存储着当前正在执行的函数调用。
JavaScript 程序的执行过程如下:
- 创建全局执行上下文。
- 将脚本中的代码放入全局执行栈中。
- 开始执行全局执行栈中的代码。
- 当遇到函数调用时,将函数的执行上下文压入执行栈中。
- 开始执行函数的执行栈中的代码。
- 当函数执行完毕后,将函数的执行上下文从执行栈中弹出。
- 继续执行全局执行栈中的代码。
- 当全局执行栈中的代码执行完毕后,脚本执行结束。