JavaScript中的LHS和RHS分析详情


Posted in Javascript onApril 06, 2022

前言:

对于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 ​​错误。![​

JavaScript中的LHS和RHS分析详情

因此,对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​​异常(严格模式下)。

到此这篇关于JavaScript中的LHS和RHS分析详情的文章就介绍到这了,更多相关JavaScript中的LHS和RHS内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
js 发个判断字符串是否为符合标准的函数
Apr 27 Javascript
不同的jQuery API来处理不同的浏览器事件
Dec 09 Javascript
html dom节点操作(获取/修改/添加或删除)
Jan 23 Javascript
Jquery $.getJSON 在IE下的缓存问题解决方法
Oct 10 Javascript
jquery判断至少有一个checkbox被选中的方法
Jun 05 Javascript
有关JavaScript中call()和apply() 的一些理解
May 20 Javascript
TableSort.js表格排序插件使用方法详解
Feb 10 Javascript
javascript中函数的写法实例代码详解
Oct 28 Javascript
vue使用pdfjs显示PDF可复制的实现方法
Dec 14 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
Jun 25 Javascript
基于小程序请求接口wx.request封装的类axios请求
Jul 02 Javascript
简单了解前端渐进式框架VUE
Jul 20 Javascript
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 #Vue.js
vue3使用vuedraggable实现拖拽功能
vue整合百度地图显示指定地点信息
vue中使用mockjs配置和使用方式
VUE使用draggable实现组件拖拽
Apr 06 #Vue.js
教你部署vue项目到docker
利用uni-app生成微信小程序的踩坑记录
Apr 05 #Javascript
You might like
叶罗丽:为什么大家对颜冰这对CP非常关心,却对金茉两人十分冷漠
2020/03/17 国漫
PHP与MySQL交互使用详解
2006/10/09 PHP
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
统计出现最多的字符次数的js代码
2010/12/03 Javascript
JQuery限制复选框checkbox可选中个数的方法
2015/04/20 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
CSS或者JS实现鼠标悬停显示另一元素
2016/01/22 Javascript
原生javascript实现匀速运动动画效果
2016/02/26 Javascript
移动端横屏的JS代码(beta)
2016/05/16 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
2017/02/14 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
2017/04/28 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
js+SVG实现动态时钟效果
2018/07/14 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
2018/09/14 Javascript
JS选取DOM元素常见操作方法实例分析
2018/12/10 Javascript
JS扁平化输出数组的2种方法解析
2019/09/17 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
2020/02/07 Javascript
[54:02]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 IG vs VGJ.T
2018/04/03 DOTA
[02:09]2018DOTA2亚洲邀请赛TNC赛前采访
2018/04/04 DOTA
python多重继承实例
2014/10/11 Python
python操作sqlite的CRUD实例分析
2015/05/08 Python
Python基础入门之seed()方法的使用
2015/05/15 Python
python中Switch/Case实现的示例代码
2017/11/09 Python
Tornado高并发处理方法实例代码
2018/01/15 Python
Python从零开始创建区块链
2018/03/06 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
Selenium python时间控件输入问题解决方案
2020/07/22 Python
Gap加拿大官网:Gap Canada
2017/08/24 全球购物
便携式太阳能系统的创新者:GOAL ZERO
2018/02/04 全球购物
手工制作的男士奢华英国鞋和服装之家:Goodwin Smith
2019/06/21 全球购物
大学毕业登记表自我鉴定
2013/10/09 职场文书
汽车检测与维修专业求职信
2013/10/30 职场文书
2014年最新离婚协议书范本
2014/10/11 职场文书
房产协议书范本
2014/10/18 职场文书
实习单位推荐信
2015/03/27 职场文书
Python图像处理之图像拼接
2021/04/28 Python