javascript中的LHS与RHS
2015-12-21 19:27
543 查看
最近在学习javascript过程中,接触了LHS与RHS的概念,刚开始的时候有点理解不清,现在做一些梳理,方便以后进行理解。
LHS与RHS:javascript引擎的两种查找类型,含义是赋值操作的左侧与右侧。
LHS:对哪个赋值就对哪个进行LHS引用,可以理解为赋值操作的目标。
RHS:需要获取哪个变量的值,就对哪个变量的值进行RHS引用,理解为赋值操作的源头。
赋值操作有多种形式,对于以上的两种对LHS与RHS的解释,我刚刚接触,还是很混乱。
我的理解就是,一般在左边的需要被赋值,就是LHS引用,右边需要寻找到他的值,就是RHS引用。
例如:
以上代码中有3个LHS与4个RHS,分析如下:
第一,var c中的c需要被赋值,在赋值操作的左侧,所以对c进行LHS引用
第二,变量c需要被赋值,他的值是foo(2),那么foo(2)的值是多少呢,需要查找foo(2)的值,在赋值操作的右侧,所以对foo(2)进行RHS引用
第三,隐含赋值操作,将2传递给function foo(a){……}函数的参数a,a在赋值操作的左侧,对a进行LHS引用
第四,var b=a;中,b需要被赋值,处在赋值操作的左侧,所以b进行的LHS,b的值将从a来,那么右侧的a的值从何而来呢?这就需要对赋值操作右侧的a进行RHS。
第五,return a+b;中,需要找到a与b的值的来源,a与b都在赋值操作的右侧,才能得到a+b的值,所以对a与b都是进行RHS引用。
为什么要区分LHS与RHS?
因为在变量还没有声明(在任何作用域中都无法找到该变量)情况下,这两种查询行为是不一样的。
例如:
以上代码对b进行RHS的时候无法找到该变量的值,则会抛出ReferenceError异常,如果是LHS找不到变量,非严格模式下,会在全局作用域中,创建一个具有该名称的变量,严格模式下,会抛出与RHS类似的异常。
例如:
以上代码中,对b进行LHS没有找到该变量,在全局作用域中创建了一个同名的变量b,在函数init外部可以访问到b变量。
如果将代码更改为如下:
在function中定义了一个局部变量b,全局作用域中定义,控制台报错如图显示,窗口中没有任何输出
将代码改成如下:
将代码改成如上所示,控制台并没有报错, 因为window.b作为window的一个属性访问,所以会返回undefined,而b作为一个变量没有定义的时候是会报错的
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,分析如下:
第一,var c中的c需要被赋值,在赋值操作的左侧,所以对c进行LHS引用
第二,变量c需要被赋值,他的值是foo(2),那么foo(2)的值是多少呢,需要查找foo(2)的值,在赋值操作的右侧,所以对foo(2)进行RHS引用
第三,隐含赋值操作,将2传递给function foo(a){……}函数的参数a,a在赋值操作的左侧,对a进行LHS引用
第四,var b=a;中,b需要被赋值,处在赋值操作的左侧,所以b进行的LHS,b的值将从a来,那么右侧的a的值从何而来呢?这就需要对赋值操作右侧的a进行RHS。
第五,return a+b;中,需要找到a与b的值的来源,a与b都在赋值操作的右侧,才能得到a+b的值,所以对a与b都是进行RHS引用。
为什么要区分LHS与RHS?
因为在变量还没有声明(在任何作用域中都无法找到该变量)情况下,这两种查询行为是不一样的。
例如:
function foo(a){ console.log(a+b); b=a; } 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变量。
如果将代码更改为如下:
<!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(b); </script> </head> <body> </body> </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作为一个变量没有定义的时候是会报错的
相关文章推荐
- javascript 将xml字符串转换成json对象
- 关于JS中的JSON
- html css js
- js控制文本框仅仅能输入中文、英文、数字与指定特殊符号
- js中奇怪的问题 同步ajax,modal遮罩层
- js window.onload 加载多个函数和追加函数
- Ext.js5表单—有真实的load,submit行为的表单(reader在json.xml中record的区别)(49)
- Javascript如何实现无限级菜单联动实例
- 关于分页,显示分页的页数<初学者心得,大神绕道>
- js中return的用法
- javascript 多图无缝切换
- JS实现下拉列表显示当前日期到之前半年的所有日期
- jsp学习
- JS日期时间类型(Y-m-d H:i:s)与时间戳互转
- javaweb开发-js代码中的function.call的参数
- 身份证校验js,包括了第18位数字的校验
- json的NSData 转换成NSDictionary
- js实现仿微博滚动显示信息的效果
- excle转json
- js解决两个数相加的问题