属于编译语言的JavaScript,编写的源代码在执行之前,会经历三个步骤,这个过程统称为“编译”。
三个步骤为:分词/词法分析 -> 解析/语法分析 -> 代码生成
第一步骤:分词/词法分析
分词:判断词法单元时,调用的是无状态的解析规则
词法分析:判断词法单元时,调用的是有状态的解析规则
过程:由字符组成的字符串分解成有意义的代码块(词法单元)
例如: var a =2 ; => 词法单元: var | a | = | 2 | ;
第二步骤:解析/语法分析
过程:将词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表了程序语法结构的抽象数据树(AST)
例如: var a =2 ;的抽象数据树
第三阶段:代码生成
过程:将AST转换为可执行代码的过程被称为代码生成
参与以上这个编译过程的有三个角色:引擎、编译器、作用域
角色一:引擎
工作职责:从头到尾负责整个JavaScript程序的编译及执行过程
执行查询类型:LHS 、RHS
当变量出在赋值操作的左侧时进行LHS查询,出现在右侧时进行RHS查询
赋值操作的目标是谁-LHS
谁是赋值操作的源头-RHS
例子:
function foo(a) { var b = a; return a + b; } var c = foo(2);
LHS: foo(a)中的a | var c = | var b =
RHS: = a | = foo(2) | return a + | return + b
引擎会在LHS和RHS的过程中,在作用域内寻找需要的变量和值
角色二:编译器
工作职责:负责语法分析及代码生成等活动
角色三:作用域
工作职责:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确实当前执行的代码对这些标识符的访问权限
三个角色的协作过程:变量的赋值操作会执行两个动作
- 在编译时,编译器会在当前作用域中声明一个变量
- 在运行时,引擎会在作用域中查找该变量,如果能够找到就会对它赋值