JavaScript的查询机制LHS和RHS解析


Posted in Javascript onAugust 16, 2019

JavaScript 引擎在查找一个变量的时候,有两种查找机制:LHS 和 RHS。

RHS 的查询是简单地查找到某个变量的值,而 LHS 则是试图找到变量的容器的本身。

一个简单的例子:当我们执行 console.log(a) 时,执行的就是 RHS ,因为这里 a 并没有赋予任何的值。相应的,需要查找并取得 a 的值,这样才能将值传递给 conso.log(..)。

而当我们执行到 a = 2 时,这里对 a 的引用就是 LHS 引用,因为实际上我们并不关心当前的值是什么,只是想要为 =2 这个赋值操作找到一个目标。

需要注意的是:

当我们执行以下代码:

function foo(a){
console.log(a); // 2
}
foo(2);

这里对 foo 的调用执行了 RHS 引用,但还有一个隐式的 a = 2 的操作,这里又执行了一个 LHS 引用。

我们通常把 function foo(a){} 转变为 var foo,foo = function(){} ,如果这样理解的话,这个函数声明会执行 LHS 查询,但是在引擎执行代码的时候,并不会有线程专门用来将一个函数值“分配给”foo。所以,将函数声明理解成 赋值 的 LHS 查询的形式并不合适。

区分 LHS 和 RHS 是一件很重要的事。如果 RHS 查询在作用域链中找不到需要的变量,会抛出 ReferenceError 的异常。

function foo(a){
console.log(a + b);
}
foo()

以上代码会抛出异常:b is not defined

相比之下,如果JavaScript引擎执行的是 LHS 查询,如果一直到顶层的作用域(全局作用域)中都没有找到目标变量的话,它就会在全局作用域中声明一个具有目标名称的变量,并将其返回给引擎。(非严格模式下,严格模式下会禁止自动创建或隐式创建全局变量)

function foo(a){
b = a; // b = 2
}
foo(2)

上面的代码执行的 LHS 查询,在非严格模式下,JavaScript 引擎在全局作用域中没有找到 b,所以它就在全局作用域中声明了一个变量 b。所以此时结果不会报错且b被赋值为2。

总结:

作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。如果查找的目的是对变量进行赋值,就会使用 LHS 查询;如果目的是获取变量的值,就会使用 RHS 查询。

= 操作符或调用函数时传入参数的操作都会导致关联作用域的赋值操作。

LHS 和 RHS 查询都会在当前执行作用域中开始,如果有需要(当前没找到),就会向上级作用域继续查找目标标识符(作用域链)。

不成功的 RHS 会导致抛出 ReferenceError 异常。不成功的 LHS 会自动隐式在全局作用域中创建一个全局变量(非严格模式下),该变量使用 LHS 引用的目标作为标识符。(如果是严格模式下也会抛出 ReferenceError 异常)。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js获取指定日期前后的日期代码
Aug 20 Javascript
8个实用的jQuery技巧
Mar 04 Javascript
JS实现网页上随滚动条滚动的层效果代码
Nov 04 Javascript
详解js跨域原理以及2种解决方案
Dec 09 Javascript
AngularJS 让人爱不释手的八种功能
Mar 23 Javascript
node.js入门教程之querystring模块的使用方法
Feb 27 Javascript
js实现一个简单的数字时钟效果
Mar 29 Javascript
JavaScript用二分法查找数据的实例代码
Jun 17 Javascript
Bootstrap 3多级下拉菜单实例
Nov 23 Javascript
Vue 动态设置路由参数的案例分析
Apr 24 Javascript
Angular8 简单表单验证的实现示例
Jun 03 Javascript
vue $router和$route的区别详解
Dec 02 Vue.js
jquery树形插件zTree高级使用详解
Aug 16 #jQuery
微信小程序云开发如何实现数据库自动备份实现
Aug 16 #Javascript
jQuery zTree树插件的使用教程
Aug 16 #jQuery
Vue 权限控制的两种方法(路由验证)
Aug 16 #Javascript
JS中的算法与数据结构之列表(List)实例详解
Aug 16 #Javascript
jQuery zTree插件快速实现目录树
Aug 16 #jQuery
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
Aug 16 #Javascript
You might like
php checkbox 取值详细说明
2010/08/19 PHP
php设计模式 Visitor 访问者模式
2011/06/28 PHP
使用php判断网页是否gzip压缩
2013/06/25 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
详解PHP匿名函数与注意事项
2016/03/29 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
input链接页面、打开新网页等等的具体实现
2013/12/30 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
JavaScript中的 attribute 和 jQuery中的 attr 方法浅析
2017/01/04 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
JavaScript实现替换字符串中最后一个字符的方法
2017/03/07 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
利用JQUERY实现多个AJAX请求等待的实例
2017/12/14 jQuery
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
js利用拖放实现添加删除
2020/08/27 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
详谈python http长连接客户端
2017/06/12 Python
Pycharm 2020年最新激活码(亲测有效)
2020/09/18 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
如何利用Python写个坦克大战
2020/11/18 Python
Gibson London官网:以地道的英国男装而著称
2019/12/06 全球购物
巾帼建功标兵事迹材料
2014/05/11 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
整改通知书
2015/04/20 职场文书
上帝也疯狂观后感
2015/06/09 职场文书
2016年中秋节晚会领导致辞
2015/11/26 职场文书
python中Matplotlib绘制直线的实例代码
2021/07/04 Python