前言
在说一个概念前,我们需要确定它的前提,此文以 ECMAScript5 为基础撰写
一句话解释
词法环境就是在 JavaScript 代码编译阶段记录变量声明、函数声明、函数声明的形参的合集
JavaScript 的编译过程
在介绍词法环境前,我们先看下在 V8 里 JavaScript 的编译执行过程,大致分为三个阶段
第一步:V8 引擎刚拿到
执行上下文
的时候,会把代码从上到下一行一行的先做分词/词法分析(Tokenizing/Lexing)。分词是指:比如var a = 2;
这段代码,会被分词为:var
a
2
和;
这样的原子符号(atomic token);词法分析是指:登记变量声明、函数声明、函数声明的形参第二步:在分词结束以后,会做代码解析,引擎将 token 解析翻译成一个 AST(抽象语法树), 在这一步的时候,如果发现语法错误,就会直接报错不会再往下执行
第三步:引擎生成 CPU 可以执行的机器码
在第一步里有个词法分析,它用来登记变量声明、函数声明、函数声明的形参,后续代码执行的时候就知道去哪里拿变量的值和函数了,这个登记的地方就是
Lexical Environment(词法环境)
总结一下:引擎会在解释 JavaScript 代码之前首先对其进行编译。编译器的一部分工作就是找到所有的声明,并用合适的作用域将它们关联起来
我们先升到一万米高空,看一下整个 JavaScript 的执行生命周期
JavaScript 的执行生命周期分成两个阶段,编译阶段和执行阶段
- 编译阶段由编译器完成,它将代码翻译成可执行代码,这个阶段能知道全部标识符在哪里、如何声明的以及作用域规则* 编译阶段进行变量声明* 编译阶段变量声明进行提升,但是指为 undefined* 编译阶段所有非表达式的函数声明进行提升
- 代码执行阶段即执行可运行代码