编译LHS 和 RHS 就是上面说的对变量的两种查找操作,查找的过程是由作用域(词法作用域)进行协助,在编译的第二步中执行。Left Hand Side和 Right Hand Side 即左手边和右手边赋值操作的左侧和右侧console.log(a);
a = 2;
function foo(a) {
console.log(a); // 2
}
foo(2);
foo(..)函数的调用需要对 foo 进行 RHS 引用,意味着是取到 foo 的值,并且 (..)意味着 foo 需要被执行,因此它最好是一个函数类型的值a = 2,它发生在 2 被当做实参传入 foo 中时。即实参 2 传给了形参 a,需要一个 LHS 查询console.log(..)本身也需要一个 RHS 引用,即对 console 对象进行 RHS 查询,并且检查得到的值中是否有一个叫做 log 的方法。function foo(a) {
var b = a;
return a + b;
}
var c = foo(2);
答案:
1.LHS 查询:
c = ..;a = 2(隐式变量分配)b = ..2.RHS 查询
foo(2..= a;a .... b参考原书中文版P12,英文版见 github
赋值操作会导致 LHS 查询。 = 操作符或调用函数时传入参数的操作都会导致关联作用域的赋值操作, 即都会导致 LHS 查询。var a = 2 这样的声明会被分解成两个独立的步骤:var a在其作用域中声明新变量。这会在最开始的阶段,也就是代码执行前进行。a = 2会查询(LHS查询)变量 a 并对其进行赋值。ReferenceError 异常。不成功的 LHS 引用会导致自动隐式地创建一个全局变量(非严格模式下),该变量使用 LHS 引用的目标作为标识符,或者抛出 ReferenceError 异常(严格模式下)。