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 相关文章推荐
jquery放大镜效果超漂亮噢
Nov 15 Javascript
js用正则表达式来验证表单(比较齐全的资源)
Nov 17 Javascript
把字符串按照特定的字母顺序进行排序的js代码
Jan 28 Javascript
JavaScript用Number方法实现string转int
May 13 Javascript
如何用javascript计算文本框还能输入多少个字符
Jul 29 Javascript
浅析BootStrap Treeview的简单使用
Oct 12 Javascript
Javascript 实现简单计算器实例代码
Oct 23 Javascript
JS实现的表头列头固定页面功能示例
Jan 10 Javascript
node.js中grunt和gulp的区别详解
Jul 17 Javascript
详解Vue-Cli 异步加载数据的一些注意点
Aug 12 Javascript
JavaScript中join()、splice()、slice()和split()函数用法示例
Aug 24 Javascript
vue实现数据控制视图的原理解析
Jan 07 Javascript
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之第二天
2006/10/09 PHP
关于在php.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
php强制运行广告的方法
2014/12/01 PHP
POST一个JSON格式的数据给Restful服务实例详解
2017/04/07 PHP
很棒的学习jQuery的12个网站推荐
2011/04/28 Javascript
jQuery 源码分析笔记(6) jQuery.data
2011/06/08 Javascript
Javascript实现重力弹跳拖拽运动效果示例
2013/06/28 Javascript
从数据库读取数据后将其输出成html标签的三种方法
2014/10/13 Javascript
Javascript使用post方法提交数据实例
2015/08/03 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
AngularJs中Bootstrap3 datetimepicker使用实例
2016/12/13 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
[02:08:58]2014 DOTA2国际邀请赛中国区预选赛 Ne VS CIS
2014/05/22 DOTA
[33:42]LGD vs OG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[04:45]DOTA2-DPC中国联赛正赛 iG vs LBZS 赛后选手采访
2021/03/11 DOTA
python 数据加密代码
2008/12/24 Python
Python基于回溯法子集树模板解决找零问题示例
2017/09/11 Python
PyTorch CNN实战之MNIST手写数字识别示例
2018/05/29 Python
Flask之flask-session的具体使用
2018/07/26 Python
Python切片操作深入详解
2018/07/27 Python
python爬虫基础教程:requests库(二)代码实例
2019/04/09 Python
DVF官方网站:美国时装界尊尚品牌
2017/08/29 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
JSP&Servlet技术面试题
2015/05/21 面试题
护理专业毕业生自我鉴定
2013/10/08 职场文书
咖啡店自主创业商业计划书
2014/01/22 职场文书
个人能力自我鉴赏
2014/01/25 职场文书
年度献血先进个人事迹材料
2014/02/14 职场文书
局火灾防控工作方案
2014/05/25 职场文书
年终考核实施方案
2014/05/26 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
法院干警四风问题个人对照检查材料思想汇报
2014/10/07 职场文书
生日赠语
2015/06/23 职场文书
springboot拦截器无法注入redisTemplate的解决方法
2021/06/27 Java/Android