如何理解js的执行上下文与执行栈

阅读时长 3 分钟读完

在JavaScript中,每当代码被执行时,都会创建一个称为"执行上下文"的内部数据结构。执行上下文是 JavaScript 引擎中非常重要的组成部分,它维护了变量、函数声明、作用域链等信息。本文将深入探讨什么是执行上下文以及如何通过执行栈来管理它们。

执行上下文

执行上下文(Execution Context)是一个抽象的概念,它描述了 JS 中代码被执行时的环境。每个执行上下文中包含了当前代码所需的所有信息,例如当前函数的参数、变量、对象等。在浏览器端,全局上下文可以通过 window 对象来获取。

执行上下文的创建

执行上下文有三种类型: 全局执行上下文、函数执行上下文和 eval 函数执行上下文。其中,全局执行上下文是最先被创建的,随后是函数执行上下文和 eval 函数执行上下文。每次调用函数或进入 eval 函数时,都会创建一个新的执行上下文。

以下是创建函数执行上下文的过程:

  1. 创建阶段(Creation Phase):首先 JavaScript 引擎会预处理函数体中的变量和函数声明,并分配空间给它们。同时,在创建阶段还会生成一个称为 "词法环境" 的内部数据结构,用于存储变量和函数的标识符以及它们所绑定的值。这个词法环境会根据作用域链来进行查找。
  2. 执行阶段(Execution Phase):执行阶段是实际执行代码的阶段。在这个阶段中,JavaScript 引擎会按照代码的执行顺序逐行解释执行。

执行上下文的属性

每个执行上下文都有三个重要的属性: 变量对象、作用域链和 this 值。

变量对象

在创建执行上下文时,JavaScript 引擎会创建一个称为 "变量对象" 的内部数据结构。变量对象是一个键值对的集合,用于存储当前执行上下文中的变量、函数声明等信息。

在全局执行上下文中,变量对象被设为 window 对象;在函数执行上下文中,变量对象包含了该函数的参数、函数声明以及 arguments 对象。

作用域链

在 JavaScript 中,每个函数都有自己的作用域(Scope),也就是定义变量和函数的区域。当一个函数被调用时,它的执行上下文会被加入到执行栈中,并创建一个新的作用域链。

作用域链本质上是一个指向变量对象的指针列表。它用于解析标识符,当 JavaScript 引擎需要查找一个变量或函数时,它会从当前执行上下文的变量对象开始查找,如果没有找到,则会继续向上查找作用域链中的下一个对象,直到找到为止。

this 值

this 关键字在 JavaScript 中是一个很重要的概念。它表示当前函数被调用时的上下文对象,或者说是当前函数被调用时所处的环境。

在全局执行上下文中,this 值指向 window 对象;在函数执行上下文中,this 值取决于函数被调用的方式。如果函数被作为对象的方法调用,则 this 指向该对象;如果函数被普通调用,则 this 指向全局对象。

执行栈

执行栈(

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/47337

纠错
反馈