编译及其过程
编译:程序在执行一段源代码之前的三个步骤:分词、解析、代码生成。
- 分词:
就是将字符组成的字符串分成有意义的代码块,比如:
var a = 2;可以被分解成var、a、 = 、2; - 解析: 就是将词法单元生成抽象语法树。(AST)
- 代码生成,将抽象语法树转换成可执行的代码
基本概念
- 引擎
- 从头到尾负责整个 JavaScript 程序的编译及执行过程
- 编译器
- 引擎的好朋友之一,负责语法分析及代码生成等脏活累活
- 作用域
- 收集并维护由所有声明的标识符(变量)组成的一系列查 询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。
例如:下面这个例子可以说明js执行代码的过程:
- 首先,var a 在其作用域中声明新变量。这会在最开始的阶段,也就是代码执行前进行。
- 接下来,a = 2 会查询(LHS 查询)变量 a 并对其进行赋值。
- LHS查询:
- 如果目的是对变量进行赋值,那么就会使用 LHS 查询
- RHS查询
- 如果目的是获取变量的值,就会使用 RHS 查询
- 作用域
- 一套规则,用于确定在何处以及如何查找变量(标识符)。 例如:下面这个例子可以用来说明LHS和RHS查询
LHS 查询: c = foo(2); foo函数的形参a接收到实参2; foo函数内部将a赋值给b;
RHS 查询: 找到foo()这个函数的引用 找到a变量的值 在foo函数内部引用变量a 在foo函数内部引用变量b
function foo(a) {
var b = a;
return a + b;
}
var c = foo( 2 );