在JavaScript中,每当代码被执行时,都会创建一个称为"执行上下文"的内部数据结构。执行上下文是 JavaScript 引擎中非常重要的组成部分,它维护了变量、函数声明、作用域链等信息。本文将深入探讨什么是执行上下文以及如何通过执行栈来管理它们。
执行上下文
执行上下文(Execution Context)是一个抽象的概念,它描述了 JS 中代码被执行时的环境。每个执行上下文中包含了当前代码所需的所有信息,例如当前函数的参数、变量、对象等。在浏览器端,全局上下文可以通过 window
对象来获取。
执行上下文的创建
执行上下文有三种类型: 全局执行上下文、函数执行上下文和 eval 函数执行上下文。其中,全局执行上下文是最先被创建的,随后是函数执行上下文和 eval 函数执行上下文。每次调用函数或进入 eval 函数时,都会创建一个新的执行上下文。
以下是创建函数执行上下文的过程:
- 创建阶段(Creation Phase):首先 JavaScript 引擎会预处理函数体中的变量和函数声明,并分配空间给它们。同时,在创建阶段还会生成一个称为 "词法环境" 的内部数据结构,用于存储变量和函数的标识符以及它们所绑定的值。这个词法环境会根据作用域链来进行查找。
- 执行阶段(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