logan70 / Blog

写博客的地方,觉得有用的给个Star支持一下~
81 stars 9 forks source link

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

Open logan70 opened 4 years ago

logan70 commented 4 years ago

JavaScript的执行上下文栈

执行上下文(Exexution Contexts)

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

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

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

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

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

执行上下文栈(Execution Context Stack)

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

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

图片出自 JavaScript Internals: Execution Context