通俗易懂的LHS和RHS

在一段代码执行之前,会经过编译阶段 。
在对程序的处理过程中,不可或缺的人物就是:引擎,编译器,作用域。
JavaScript在预编译后执行代码时,引擎就会对其进行查询,查询分为:
LHS:Left-Hand-Side
RHS:Right-Hand-Side
即赋值的左侧和右侧:当出现在赋值操作的左侧时进行LHS查询,出现在右侧时进行RHS查询。
例:

function foo(a){
var b=a;
return a+b;
}
var c=foo(2);

在上述例子中,
像Kyle Simpson前辈一样,我们可以将自己当作引擎然后去和作用域进行对话,然后就会发现:有3处LHS查询,
分别是a=2 c=… b=…
有4处RHS查询
分别是:
foo(2… =a a… …b
RHS查询就相当于简单地查找某个变量的值
LHS查询是试图找到变量的容器本身,从而可以对其进行赋值。
因此在此例中:
c的赋值操作需要对c进行一次LHS查询,而对于foo(2)来说,需要进行一次RHS查询,去获取值.foo是一个函数,foo(a){},这里有一个隐式赋值操作,需要对a进行一次LHS查询,判断作用域中是否存在名为a的变量,若存在则直接赋值a=2;
不存在,(1)如果是严格模式下,则报ReferenceError:a is not defined.
(2)如果非严格模式,则创建一个a的全局变量,并直接赋值a=2;
在函数这个作用域内,var b = a;对b进行一次LHS查询,对a进行一次RHS查询
最终return a + b;需要分别对a和b进行RHS查询。

当一个函数嵌套在另一个函数中,即作用域的嵌套。则:在当前作用域中无法找到某个变量时,引擎就会在外层嵌套的作用域中继续查找,直到找到该变量或到达最外层的作用域为止。
例:

function foo(c){
console.log(c+d);
}
var d=2;
foo(2);

观察上述例子,我们发现在函数内部无法对d进行RHS引用,则向外继续查找,则在全局作用域中完成。

如何区分RHS和LHS
(1)若RHS查询在所有嵌套的作用域中找不到所需的变量,则引擎就会抛出ReferenceError异常
(2)若是执行LHS查询,若在全局作用域中也没有找到所需变量,则:1.程序运行在非严格模式下:全局作用域会创建一个具有该名称的变量,然后将其返回给引擎
2.程序运行在严格模式下:禁止自动或隐式地创建全局变量,因此引擎会抛出ReferenceError异常。

注:若查找的目的是对变量进行赋值,则使用LHS查询
若查找的目的是获取变量的值,则使用RHS查询。

你可能感兴趣的:(通俗易懂的LHS和RHS)