编译器在编译的过程中生成了代码,引擎执行的时候,会通过查找变量a来判断他是否声明过。查找的过程由作用域协助。
LHS和RHS基本看名字就能知道,L是左,是右。变量出现在复制操作的左侧时进行LHS查询,而在右侧时进行RHS,更确切的说,RHS是代表非左侧。
LHS查询比较松散,如果查询不到就会在全局作用域创建一个具有该名称的变量,不会抛出异常(非严格模式下,在严格模式下找不到,会抛出ReferenceError异常)。但是RHS查询比较严格,如果查询不到,引擎就会抛出ReferenceError异常,其实一想就明白,你在右侧,本来就是为了给左侧赋值,如果你本身还找不到值,那肯定是有错的。
以下是《你所不知道的JAVASCRIPT》中的两个例子
1.
function foo(a){
console.log(a);//console ②RHS 这里有个隐式的a=2②LHS
}
foo(2); // foo①RHS 这里有个隐式的a=2①LHS
2.
function foo(a){
var b = a ; // b= ③LHS =a ②RHS
return a + b; a③RHS ④RHS
}
var c = foo(2);//c= ①LHS 这里有个隐式的a=2②LHS foo ①RHS