执行上下文

什么是执行上下文(Execution Context)?

执行上下文可以理解为当前代码的执行环境,它会形成一个作用域。

JavaScript中的执行环境大概包括以下三种情况:

  • 全局环境:JavaScript代码运行起来会首先进入该环境
  • 函数环境:当函数被调用执行时,会进入当前函数中执行代码
  • eval(可忽略)

在JavaScript程序中,JavaScript引擎会以函数调用栈(call stack)的方式来处理产生的执行上下文。栈底永远都是全局上下文,而栈顶就是当前正在执行的上下文。

了解执行上下文的生命周期(Life Cycle)

当调用一个函数时,就会创建一个新的执行上下文。

此时执行上下文的生命周期包括两个阶段:

  • 创建阶段:生成变量对象、建立作用域链、确定this指向。
  • 执行阶段:变量赋值、函数引用、执行其他代码。

变量对象(Variable Object):

变量对象(VO)是一个与执行上下文相关的特殊对象,它存储着在上下文中声明的以下内容: + 函数的形参 + 函数声明 (FunctionDeclaration, 缩写为FD) + 变量声明

作用域与作用域链(scope chain):

在JavaScript中,作用域与执行上下文是完全不同的两个概念。

我们可以将作用域定义为一套规则,这套规则用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称进行变量查找。

作用域链,是由当前环境与上层环境的一系列变量对象组成,它保证了当前执行环境对符合访问权限的变量和函数的有序访问。