js 编译原理
引擎:从头到尾负责整个javaScript 程序的编译过程和执行过程。
编译器: 负责语法分析以及代码的生成。
作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询, 并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。
var a =1;
- 上面的代码首先会经过编译器编译,编译成var a;a = 1;两部分。
- 编译器首先会遇到 var a,编译器首先会在作用域中进行查找,如果找到该变量则会忽略改变量,继续往下编译,如果未找到该变量,编译器会在该作用域下声明一个新的变量,并命名为a.
- 编译器继续往下执行,遇到a = 1,他会把这个编译成引擎能够运行的代码,这些代码来进行a = 1,这个操作。
- 引擎找到编译后的代码,首先会在作用域中查找变量a,如果找到变量a,进行赋值操作,如果没找到,继续往上层作用域进行查找,如果顶层作用域还是没有查找到改变量,引擎会抛出异常。
编译器将a=1 编译之后,引擎在作用域查找的过程我们称为(RHS),进行赋值的过程叫做(LHS)。我们来看一个例子
function test(item){ var b = 0; return b; } test(2)
- 首先对test 进行 (RHS)引用
- 传了个参数 2 到test函数中,item进行隐性赋值,进行(LHS)引用。
- 声明b变量进行(RHS)引用,在进行b=0赋值,(LHS)引用。
- 最后return b变量 进行一次(RHS)引用。