Execution Context、Lexical Environment、Scope、Scope Chain、Lexical Scope

182 阅读2分钟

关于标题,需要从JS执行一段代码说起。 JS引擎执行一段代码分为两个过程。

  1. 编译阶段。此阶段又分为三个阶段。
    1. 词法分析,即分词,学过编译原理的应该知道。需要把代码分成一个个字符,比如:var a;分词[var,a],分词结果称之为token;
    2. 语法分析,parse。把token转换成AST,抽象语法树。
    3. 把AST转换成可执行代码,同时创建执行上下文(Execution Context)。
  2. 运行阶段。此阶段是真正的执行代码阶段。

一、执行上下文

  1. 执行上下文分为全局执行上下文和函数执行上下文。
  2. 执行上下文包含词法环境(LexicalEnvironment)和变量环境(VariableEnvironment),还有其他很多。
  3. 执行上下文被放入调用栈(或叫执行上下文栈)使用。可执行代码会根据执行上下文操作。

二、词法环境

  1. 词法环境是存储标识符和变量的映射的数据结构。
  2. 该环境分为环境记录和outer引用。环境记录主要包含声明式记录和对象环境记录。声明式环境记录中包含了函数环境记录,而函数环境记录中就存在着this的绑定。所以,this的绑定是在函数执行的时候确定的,因为执行上下文就是在函数执行的时候才会创建。并且变量提升就是因为编译时变量初始化为undefined所发生的。
  3. outer指向的是父级上下文。而父级上下文中的outer会继续指向上一级,这就形成了作用域链(Scope Chain)

三、作用域(Scope) 作用域是变量和函数可访问范围,是一个虚拟的概念。规定了变量和函数的访问规则。词法环境是对作用域的具体实现。

四、词法作用域 词法作用域又叫静态作用域,是指代码定义时就就已经确定了作用域而不是执行阶段。因此作用域是由js代码结构决定的。