Event loop

image.png
在 Call Stack 中执行的就是 执行上下文。

当 JS 引擎拿到每一个执行上下文时,会进行

  1. 分词和词法分析
  2. 代码解析
  3. JS 引擎生成 CPU 可以执行的机器码

    分词

    把代码进行拆分成原子符号
    var age = 20;
  • 会拆分为 varage20; 这个个原子符号
  • 然后对每个原子符号 (atomic token)作词法分析

    词法分析

  1. 登记变量声明
  2. 函数声明
  3. 函数声明里的形参

这些变量和函数会登记在 记法环境 当中

代码解析

JS引擎会将符号(token)翻译成一个 AST 抽象语法树,来表示每个符号,
如果有语法错误,直接报错并停止往下运行

  1. var name = 'a';
  2. console.log(name); // 这里不会被打印出来
  3. name = ,'b'; // 代码解析时发现错误后,报错。停止运行

词法环境 Lexical Context

词法环境分为

  • 环境记录 Environment Record
    • 用来登记变量的地方
  • 对外部词法环境的引用 outer
    • 与作用域链相关

环境记录

声明式环境记录 Declarative Environmnet Record

  • 用于记录直接有标识符定义的元素,如

    • 变量、常量、let、class、module、import、函数声明

      函数环境记录 Function Environment Record

  • 用于函数作用域

    模块环境记录 Module Environment Record

  • 用于体现一个模块的外部作用域,即模块 export 所在的环境

    对象式环境记录 Object Environment Record

    • 用于记录 with、global 的记法环境

      :::info 词法环境是在代码定义的时候决定的,跟代码在哪里调用无关。(与 this 的指向相反)
      JavaScript 采用的是记法作用域 (静态作用域,闭包的环境) ::: image.png