举个栗子,var a = 2;
JavaScript引擎会将它分为几步完成呢?
答案是两步,JavaScript 会将其看成两句声明:var a;
和 a = 2;
。
第一个定义声明在编译阶段进行。
第二个赋值声明会被留在原地等待执行阶段。
下面是原书对这句声明的拆解分析:
变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后在运行时引擎会在引用域中查找该变量,如果能够找到就会对它赋值。
LHS
和 RHS
就是上面说的对变量的两种查找操作,查找的过程是由作用域(词法作用域)进行协助,在编译的第二步中执行。
LHS(Left-hand Side
)引用和RHS(Right-hand Side
)引用。通常是指等号(赋值运算)的左右边的引用。
我们来看下面这句代码:
console.log(a);
这里对a的引用是一个RHS引用,因为这里a并没有赋予任何值,我们只是想查找并取得a的值,然后将它打印出来。
a = 2;
这里对a的引用是一个LHS引用,因为我们并不关心当前的值是什么,只是想要为赋值操作找到目标。