Skip to content

执行上下文

什么是执行上下文

执行上下文是 ECMAScript跟踪javascript代码运行时的规范。当javascript代码运行时,都是运行在执行上下文中

执行上下文一般分为如下

  • 全局执行上下文:默认的执行上下文,在执行script、module时会自动创建该执行上下文,任何不在函数内部的代码,都是在全部执行上下文运行的。全局执行上下文只有一个
  • 函数执行上下文:每个函数在执行时会创建新的执行上下文,并将该执行上下文压入执行栈内,做为新的运行执行上下文。函数执行上下文可以存在多个
  • eval执行上下文:eval代码拥有自己的执行上下文,但是一般不会使用eval

特点

  1. 在每一个时刻,只有一个执行上下文运行,称为运行执行上下文(running execution context
  2. 使用执行上下文栈(execution context stack)来维护执行上下文
  3. 当运行执行上下文转移控制权时,会创建一个新的上下文并入栈,成为新的运行的执行上下文,随之老的执行上下文将会被暂停
  4. 执行上下文内部包含以下对象

内部状态组件

执行上下文都包含以下组件

  • **code evaluation state(**代码执行状态):执行暂停、恢复与此代码的所需的任何状态
  • Function(函数):如果执行的函数,则该对象指向该函数;否则为空值(如Script、Module)
  • Realm(领域):访问ECMAScript资源,当该执行上下文为运行执行上下文,则该值也可称为the current Realm Record,对于函数来说则可称为活动函数对象(active function object)
  • ScriptOrModule(脚本或者模块):记录来源

ECMAScript代码执行上下文还包含如下组件

  • LexicalEnvironment:词法环境,也是一种ECMAScript规范,其实对标于Scope
  • VariableEnvironment:变量环境,用于存储 VariableStatements 绑定

此处需要注意下,由 let、const声明的变量不叫 VariableStatement,只有 var 声明才是

var ===> VariableDeclaration ===> VariableStatement
let const ===> LexicalDeclaration ===> LexicalStatement

词法环境和变量环境其都是_词法环境,只有存储的数据不同_