1.引擎: 从头到尾负责整个js程序的编译和执行
2.编辑器:负责语法分析及代码生成等
3.作用域:负责收集并维护由所有声明的标识符组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限
4.var a = 2; 编译器做的处理:1) 遇到var a,编译器会询问作用域是否已经有一个该名称的变量存在于同一个作用域的集合中。如果是,编译器会忽略该声明,继续进行编译;否则他会要求作用域在当前作用域的集合中声明一个新的变量,命名为a。
2) 编译器会为引擎生成运行时所需的代码,这些代码被用来处理a=2这个赋值操作。引擎运行时会首先询问作用域,在当前的作用域集合中是否存在一个叫作a的变量。如果否,引擎就会使用这个变量;如果不是,引擎会继续查找该变量,如果引擎最终找到了a变量,就会将2赋值给它,否则引擎就会举手示意并抛出一个异常
5.引擎为变量a进行LHS查询和RHS(retrieve his source value)查询。
1)console.log(a) RHS,需要查找并取得a的值。
2)a=2,LHS,不需要关心当前的值是什么,只想找到=2的目标
6.编译器可以在代码生成的同时处理声明和值的定义
网友评论