返回

JavaScript 执行上下文与执行栈详解

前端

JavaScript 是一种单线程、事件驱动的编程语言,它在运行时创建一个执行上下文,并将代码放入执行栈中执行。执行上下文包含当前正在执行的函数、变量和对象,而执行栈是一个后进先出(LIFO)数据结构,它存储着当前正在执行的函数调用。

在 ES3 中,执行上下文是全局作用域和函数作用域。全局作用域是脚本的最外层,它包含所有在脚本中声明的变量和函数。函数作用域是函数内部的代码块,它包含在函数中声明的变量和函数。

在 ES6 中,执行上下文除了全局作用域和函数作用域之外,还增加了块级作用域。块级作用域是使用 let 和 const 声明的变量和函数的作用域。块级作用域只在声明它们的块内有效。

执行栈是一个后进先出(LIFO)数据结构,它存储着当前正在执行的函数调用。当一个函数被调用时,它会被压入执行栈中。当函数执行完毕后,它会被从执行栈中弹出。

执行上下文和执行栈是 JavaScript 程序执行的基础,理解它们对于理解 JavaScript 的运行机制非常重要。

执行上下文

执行上下文是 JavaScript 程序执行的环境,它包含当前正在执行的函数、变量和对象。执行上下文分为全局执行上下文和函数执行上下文。

  • 全局执行上下文

全局执行上下文是脚本的最外层,它包含所有在脚本中声明的变量和函数。全局执行上下文在脚本开始执行时被创建,并在脚本执行完毕后被销毁。

  • 函数执行上下文

函数执行上下文是函数内部的代码块,它包含在函数中声明的变量和函数。函数执行上下文在函数被调用时被创建,并在函数执行完毕后被销毁。

每个执行上下文都有自己的变量对象和作用域链。变量对象存储着在该执行上下文中声明的变量和函数。作用域链是一个指针链,它指向当前执行上下文及其父执行上下文的变量对象。

执行栈

执行栈是一个后进先出(LIFO)数据结构,它存储着当前正在执行的函数调用。当一个函数被调用时,它会被压入执行栈中。当函数执行完毕后,它会被从执行栈中弹出。

执行栈总是指向当前正在执行的函数的执行上下文。当一个函数被调用时,它的执行上下文会被压入执行栈中,并且执行栈会指向该执行上下文。当函数执行完毕后,它的执行上下文会被从执行栈中弹出,并且执行栈会指向该执行上下文的父执行上下文。

执行过程

JavaScript 程序的执行过程如下:

  1. 创建全局执行上下文。
  2. 将脚本中的代码放入全局执行栈中。
  3. 开始执行全局执行栈中的代码。
  4. 当遇到函数调用时,将函数的执行上下文压入执行栈中。
  5. 开始执行函数的执行栈中的代码。
  6. 当函数执行完毕后,将函数的执行上下文从执行栈中弹出。
  7. 继续执行全局执行栈中的代码。
  8. 当全局执行栈中的代码执行完毕后,脚本执行结束。

总结

执行上下文和执行栈是 JavaScript 程序执行的基础,理解它们对于理解 JavaScript 的运行机制非常重要。

执行上下文包含当前正在执行的函数、变量和对象。执行栈是一个后进先出(LIFO)数据结构,它存储着当前正在执行的函数调用。

JavaScript 程序的执行过程如下:

  1. 创建全局执行上下文。
  2. 将脚本中的代码放入全局执行栈中。
  3. 开始执行全局执行栈中的代码。
  4. 当遇到函数调用时,将函数的执行上下文压入执行栈中。
  5. 开始执行函数的执行栈中的代码。
  6. 当函数执行完毕后,将函数的执行上下文从执行栈中弹出。
  7. 继续执行全局执行栈中的代码。
  8. 当全局执行栈中的代码执行完毕后,脚本执行结束。