Skip to content

作用域与闭包 - JavaScript的执行上下文栈 #26

@logan70

Description

@logan70

JavaScript的执行上下文栈

执行上下文(Exexution Contexts)

JavaScript可执行代码有以下四种类型,每个类型的代码均在其自己的执行上下文内运行:

模块代码 和 eval代码 在本文中不作讨论

  • 全局代码
  • 函数代码
  • 模块代码(即ES Module,平常用的importexport即属于此类型的关键字)
  • eval代码

执行上下文 是一个描述代码运行时所在环境的抽象概念。

JS引擎再开始执行代码前,会创建 全局执行上下文 ,全局代码(不属于任何函数的代码)在全局执行上下文中执行。 全局执行上下文 在每个JS程序中只有一个。

当执行全局代码时,可能会碰到函数调用,这时JS引擎会创建 函数执行上下文 并执行函数代码,也就是说在一个执行上下文中可以创建另一个执行上下文。函数中再调用函数或函数中调用自身也是如此。这些执行上下文就构成了 执行上下文栈

执行上下文栈(Execution Context Stack)

执行上下文栈 是一种后进先出(last-in-first-out, LIFO)的栈式数据结构,运行时执行上下文(Running Excution Context)永远处于栈顶位置。

当要创建新的执行上下文时,会将当前执行上下文挂起,新的执行上下文被创建并压入栈中,成为运行时执行上下文。当对应代码执行完毕后,该执行上下文出栈,上一个执行上下文又成为运行时执行上下文。

图片出自 JavaScript Internals: Execution Context

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions