先说结论:LHS查询盒子,RHS查询值
例如:
LHS查询
var a = 2;
上面这一句赋值语句,对a变量执行的是LHS查询,它的目的是为 =2 的赋值操作找到一个目标,即一个盒子。
在编译器遇到 var a 时会询问作用域是否已存在一个叫a的变量,若存在则编译器会忽略该声明继续进行编译,若不存在则会要求作用域在当前作用域中声明一个新的变量并命名为 a。
RHS查询
console.log(a);
上面这一句打印语句,对a变量执行的时RHS查询,因为它的目的是找到a变量内部的值并打印而不是给它进行赋值。
代码举例:
1. function fn(a) {
2. console.log(a); //1
3. }
4. fn(1);
1.第4行调用fn()函数时,对它的值进行了访问即一次RHS查询。
2.调用fn函数时对它的形参a进行了赋值操作,即找一个名为a的变量盒子来存放1,进行了一次LHS查询。
3.第2行打印a的值时查询了a变量内部的值因此进行了一次RHS查询。
1. function fn2(a) {
2. var b = a;
3. return a + b;
4. }
5. var c = fn2(2);
1.var c 声明变量LHS
2.fn2 调用函数RHS
3.fn2( 2 )形参赋值LHS
4.var b 声明变量LHS
5.b = a 获取a值RHS
6.return a + b 获取a值RHS
6.return a + b 获取b值RHS
执行RHS查询时,若遍寻所有上级作用域都无法找到该变量则抛出ReferenceError异常
而执行LHS查询,未找到该变量则会创建该变量,前提是当前处于非严格模式。