您现在的位置是:群英 > 开发技术 > web开发
LHS和RHS在JavaScript中的怎么理解
Admin发表于 2022-05-26 17:25:28810 次浏览
这篇文章主要给大家介绍“LHS和RHS在JavaScript中的怎么理解”的相关知识,下文通过实际案例向大家展示操作过程,内容简单清晰,易于学习,有这方面学习需要的朋友可以参考,希望这篇“LHS和RHS在JavaScript中的怎么理解”文章能对大家有所帮助。

 

前言:

对于lhs和rhs,从字面意思来说是​​ left hand side​​和​​ right hand side​​即左手边和右手边,一般可以理解为赋值操作的左侧和右侧,然而不能片面的用​​=​​号左边还说右边去判断是​​lhs​​还是​​rhs​​通俗的理解,​

​lhs​​是赋值操作即可以看做是在往内存中存储值,而​​rhs​​是取值操作,它是从内存中进行检索。事实上赋值操作还有其他几种形式,因此在概念上最好将其理解为“赋值操作的目标是谁(lhs)”以及“谁是赋值操作的源头(rhs)”。

进一步理解

这两种不同的引用方式对没有声明的变量的处理方式上是不同的,而这个不同之处对于我们编写代码和分析js引擎报错是很有益处的。 当对一个变量执行​​rhs​​查询时,如果遍历该变量所在处的词法作用域未能找到这个变量,js引擎就会抛出​​ referenceerror​​错误如果成功查询到了这个变量,但是对这个变量执行不合理操作,比如对一个非数组的变量执行下标取值,js引擎就会抛出​​ typeerror​​错误,甚至跟你说这个操作对应的只能是数组。当对一个变量执行​

​lhs​​查询时,同样在遍历作用域后无法找到该变量,在非​​es5​​的严格模式下,系统就会自动在全局作用域中创建一个同名变量,并将引用转移到该新建的全局变量中。而在​​es5​​的严格模式下,lhs查询失败时js引擎会抛出一个同rhs一样的​​ referenceerror ​​错误。![​

因此,对lhs查询和rhs查询的仔细区分和理解无论是对js执行过程本身的理解还是分析错误都是有所好处的。

在js语言特点

javascript在类型上通常会被归类为“动态”或“解释执行”语言,但事实上它是一门编译语言。

javascript是世界上最流行的脚本语言,因为你在电脑、手机、平板上浏览的所有的网页,以及无数基于html5的手机app,交互逻辑都是由javascript驱动的。

简单地说,javascript是一种运行在浏览器中的解释型的编程语言。

不过这种语言与传统的编译语言还是有点不同,它不是提前编译的,编译结果也不能在分布式系统上进行移植,做过前端项目部署的同学,也会发现,我们将项目编译完成之后是个​​dist​​文件,之后将这整个文件直接放在web服务器上面,如nginx、tomcat等,这个是个很纯粹的单机部署。

编译特点

比如说,执行一个赋值语句,我们的javascript引擎要做多少事呢?

var girlfriend = 'naug'

事实上做了两步,javascript 会将其看成两句声明:​​var girlfriend;​​和​​girlfriend = 'naug';​

  • 定义声明在编译阶段进行
  • 赋值声明会被留在原地等待执行阶段。

分析

变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后在运行时引擎会在作用域中查找该变量,如果能够找到就会对它赋值。 而要讲的lhs 和 rhs就是上面说的对变量的两种查找操作,查找的过程是由作用域(词法作用域)进行协助,在编译的第二步中执行。 前面我们说到,​​lhs​​是赋值操作就是在往内存中存储值,而​​rhs​​是取值操作可以从内存中检索值,那么基于这个信息点,我们再来分析一个复杂一些的例子

function together(people) {
var girlfriend = people;
return girlfriend
}


var luckygirl = together('naug');

问,这个例子中一共用了多少个lhs和rhs? 答,3个lhs和3个rhs

  • lhs

- 函数里面隐藏的​​people = 'naug'​​(隐式变量分配),当调用​​together('naug')​​时,需要将实参​​naug​​赋值给形参​​people​​,所以对​​people​​需要进行​​lhs​​操作 - 对于​

​girlfriend = people​​ ,中,girlfriend在赋值操作的左边,即将该变量往该作用域空间所在内存区间储值,也就是进行lhs操作 - ​

​luckygirl = ... ​​,中​​luckygirl​​在赋值操作的左边,需要为该变量在内存中进行储值,即对​​luckygirl​​进行​​lhs​​操作

  • rhs

- ​​girlfriend = people​​ ,中​​people​​在赋值操作的右边,​​javascript​​引擎需要对其进行取值操作,因此进行​​rhs​​查询 - ​

​return girlfriend​​,由于需要知道​​girlfriend​​的值,因此进行​​rhs​​查询到​​girlfriend​​的值 - ​

​luckygirl = together('naug')​​,中​​together('naug')​​在赋值操作的右边因此需要知道该函数执行之后的值 小结:如果查找的目的是对变量进行赋值,那么就会使用lhs查询;如果目的是获取变量的值,就会使用rhs查询。

区分 lhs 和 rhs 的重要性

因为在变量还没有声明(在任何作用域中都无法找到该变量)情况下,这两种查询行为是不一样的。 对于作用域的分析可以看一下这篇文章​ ​关于js中的作用域​​,这里想说的是lhs和rhs都会在当前执行作用域中开始,如果有需要(也就是说他们没有找到所需的标识符),就会向上级作用域继续查找目标标识符,依次上升一次作用域,最后抵达全局作用域,最后无论找到或没找到都将到此为止

总结:

不成功的rhs引用会导致抛出​​referenceerror​​异常。不成功的lhs引用会导致自动隐式地创建一个全局变量(非严格模式下),该变量使用lhs引用的目标作为标识符,或者抛出​​referenceerror​​异常(严格模式下)。



以上就是关于LHS和RHS在JavaScript中的怎么理解的介绍啦,需要的朋友可以参考上述内容,希望对大家有帮助,欢迎关注群英网络,小编将为大家输出更多高质量的实用文章!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: JavaScript,LHS,RHS
相关信息推荐
2022-09-24 17:13:16 
摘要:本文主要介绍了php实现ffmpeg处理视频的实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2022-05-06 17:58:21 
摘要:本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Pandas的相关问题,包括了Pandas的索引操作、对齐运算和函数应用等等,下面一起来看一下,希望对大家有帮助。
2021-12-21 17:49:10 
摘要:这篇文章我们来了解C++中的Lambda表达式的内容,下文对Lambda表达式的作用和使用都有很详细的介绍,有需要的朋友可以参考,感兴趣的朋友接下来就跟随小编来了解看看吧!
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部