LHS 查询和 RHS查询
LHS 查询:赋值操作的左侧。LHS查询试图找到变量的容器本身,从而可以对其赋值。
RHS查询:查找某某某的值。
function foo(a) {
console.log( a ); // 2
}
foo( 2 );
上面这段程序中既有 LHS 也有 RHS 引用,把2当作参数传递给foo(...),隐式的发生了 a=2 的操作,为了给参数 a 分配值,需要进行一次LHS查询。
这里还有对 a 进行的 RHS 引用,并且将得到的值传给了 console.log(..)。console.log(..) 本身也需要一个引用才能执行,因此会对 console 对象进行 RHS 查询,并且检查得到的值中是否有一个叫作 log 的方法。
什么是作用域?
作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。
如果查找的目的是对变量进行赋值,那么就会使用 LHS 查询;如果目的是获取变量的值,就会使用 RHS 查询。
赋值操作符会导致 LHS 查询。=操作符或调用函数时传入参数的操作都会导致关联作用域的赋值操作。
JavaScript 引擎首先会在代码执行前对其进行编译,在这个过程中,像 var a = 2 这样的声明会被分解成两个独立的步骤:
1. 首先,var a 在其作用域中声明新变量。这会在最开始的阶段,也就是代码执行前进行。
2. 接下来,a = 2 会查询(LHS 查询)变量 a 并对其进行赋值。
LHS 和 RHS 查询都会在当前执行作用域中开始,如果有需要(也就是说它们没有找到所需的标识符),就会向上级作用域继续查找目标标识符,这样每次上升一级作用域(一层楼),最后抵达全局作用域(顶层),无论找到或没找到都将停止。
不成功的 RHS 引用会导致抛出 ReferenceError 异常。不成功的 LHS 引用会导致自动隐式地创建一个全局变量(非严格模式下),该变量使用 LHS 引用的目标作为标识符,或者抛出 ReferenceError 异常(严格模式下)。