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 相关文章推荐
jquery Mobile入门—外部链接切换示例代码
Jan 08 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
Nov 25 Javascript
用jquery等比例控制图片宽高的具体实现
Jan 28 Javascript
jQuery瀑布流插件Wookmark使用实例
Apr 02 Javascript
JS图片等比例缩放方法完整示例
Aug 03 Javascript
Bootstrap对话框使用实例讲解
Sep 24 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
Jan 21 Javascript
实现jquery放大镜的两种方法
Feb 22 jQuery
Vue项目添加动态浏览器头部title的方法
Jul 11 Javascript
JS实现提示框跟随鼠标移动
Aug 27 Javascript
javascript利用canvas实现鼠标拖拽功能
Jul 23 Javascript
Vue路由权限控制解析
Nov 09 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
PHP句法规则详解 入门学习
2011/11/09 PHP
php设计模式之观察者模式的应用详解
2013/05/21 PHP
Zend studio文件注释模板设置方法
2013/09/29 PHP
php实现分页显示
2015/11/03 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
2019/10/18 PHP
Laravel框架源码解析之入口文件原理分析
2020/05/14 PHP
js中判断控件是否存在
2010/08/25 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
2013/05/17 Javascript
jQuery回车实现登录简单实现
2013/08/20 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
jQuery中hover与mouseover和mouseout的区别分析
2015/12/24 Javascript
浅谈JavaScript中变量和函数声明的提升
2016/08/09 Javascript
微信小程序实现多宫格抽奖活动
2020/04/15 Javascript
jQuery实现模糊搜索功能的方法分析
2018/06/29 jQuery
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
vue实现顶部菜单栏
2020/11/08 Javascript
最基础的Python的socket编程入门教程
2015/04/23 Python
详解如何使用Python编写vim插件
2017/11/28 Python
python监控键盘输入实例代码
2018/02/09 Python
Python贪心算法实例小结
2018/04/22 Python
实例讲解python中的协程
2018/10/08 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
python相对企业语言优势在哪
2020/06/12 Python
pytorch查看模型weight与grad方式
2020/06/24 Python
使用css3制作登录表单的步骤
2014/04/07 HTML / CSS
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
如何为DataGridView添加一个定制的Column Type
2014/01/21 面试题
软件测试题目
2013/02/27 面试题
学校百日安全生产活动总结
2014/07/05 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS
如何使用pdb进行Python调试
2021/06/30 Python
win11怎么用快捷键锁屏? windows11锁屏的几种方法
2021/11/21 数码科技
TV动画《神废柴☆偶像》公布先导PV
2022/03/20 日漫