javascript中的LHS与RHS

来源:互联网 发布:浙江林业干部网络学堂 编辑:程序博客网 时间:2024/06/01 10:44

最近在学习《你不知道的JS》,接触了LHS与RHS的概念,方便以后进行理解。

LHS与RHS:javascript引擎的两种查找类型,含义是赋值操作的左侧与右侧。

LHS:对哪个赋值就对哪个进行LHS引用,可以理解为赋值操作的目标。

RHS:需要获取哪个变量的值,就对哪个变量的值进行RHS引用,理解为赋值操作的源头。

赋值操作有多种形式,对于以上的两种对LHS与RHS的解释,我刚刚接触,还是很混乱。

我的理解就是,一般在左边的需要被赋值,就是LHS引用,右边需要寻找到他的值,就是RHS引用。

书中的例子:

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

这里有3次LHS引用和4 次RHS引用

1.var c  这里c需要被赋值,在赋值操作的左侧,所以对c进行LHS引用

2.变量c需要被赋值,他的值是foo(2),那么foo(2)的值是多少呢,需要查找foo(2)的值,在赋值操作的右侧,所以对foo(2)进行RHS引用

3.隐含赋值操作,将2传递给function foo(a){……}函数的参数a,a在赋值操作的左侧,对a进行LHS引用

4.var b=a;中,b需要被赋值,处在赋值操作的左侧,所以b进行的LHS,b的值将从a来,那么右侧的a的值从何而来呢?这就需要对赋值操作右侧的a进行RHS。

5.return a+b;中,需要找到a与b的值的来源,a与b都在赋值操作的右侧,才能得到a+b的值,所以对a与b都是进行RHS引用

为什么要区分LHS与RHS?

因为在变量还没有声明(在任何作用域中都无法找到该变量)情况下,这两种查询行为是不一样的。

1 function foo(a){2       console.log(a+b);3       b=a;4 }5 foo(2)

以上代码对b进行RHS的时候无法找到该变量的值,则会抛出ReferenceError异常,如果是LHS找不到变量,非严格模式下,会在全局作用域中,创建一个具有该名称的变量,严格模式下,会抛出与RHS类似的异常。

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Document</title>    <script type="text/javascript">          function init(a){               b=a+3;                         }      init(2);          alert(b);//5    </script></head><body>    </body></html>
以上代码中,对b进行LHS没有找到该变量,在全局作用域中创建了一个同名的变量b,在函数init外部可以访问到b变量。

如果将代码更改为如下:

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4     <meta charset="UTF-8"> 5     <title>Document</title> 6     <script type="text/javascript"> 7           function init(a){ 8                 var b=a+3; 9                10           }11       init(2);    12       alert(b);13     </script>14 </head>15 <body>16     17 </body>18 </html>
在function中定义了一个局部变量b,全局作用域中定义,控制台报错如图显示,窗口中没有任何输出


将代码改成如下:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Document</title>    <script type="text/javascript">          function init(a){               var b=a+3;                       }      init(2);          alert(window.b);//undefined    </script></head><body>    </body></html>

将代码改成如上所示,控制台并没有报错, 因为window.b作为window的一个属性访问,所以会返回undefined,而b作为一个变量没有定义的时候是会报错的

0 0
原创粉丝点击