对于JS来说,大部分情况下,编译发生在代码执行前的几微秒(甚至更短)的时间内。
1.2 理解作用域
var a = 2;
编译器在执行上面代码时候,都做了什么?
(1) 遇到 var a; 编译器会询问作用域,是否已经有一个该名称的变量存在于同一个作用域内,如果有,编译器会忽略声明,继续进行编译;否则,会在当前作用域内声明一个新的变量,并命名为 a;
(2) 接下来,编译器会为引擎生成运行时所需的代码,这些代码被用来处理 a = 2 这个赋值操作。引擎运行时,会首先询问作用域,在当前作用域内是否存在一个叫做a的变量,如果是,引擎就会使用这个变量。否则,引擎就会继续查找这个变量。
1.2.3 编译器有话说
我们回头看看上面的第二步,编译器会为引擎生成运行时所需的代码,接下来,引擎开始进行查找。可是,引擎会执行怎样的查找呢?
还是以 var a = 2 为例,
引擎会为变量a进行 LHS 查询,另外一个查找的类型是 RHS
这两个是什么意思?
LHS:L代表左侧,从左侧开始查找,即LHS查询是试图找到变量的容器本身,从而可以对其赋值。
RHS:R代表右侧,从右侧开始查找,即RHS查询就是简单的查找某个变量的值。