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 相关文章推荐
Javascript 获取LI里的内容
Dec 17 Javascript
图片img的src不变让浏览器重新加载实现方法
Mar 29 Javascript
JavaScript判断textarea值是否为空并给出相应提示
Sep 04 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
Jul 04 Javascript
Javascript中字符串replace方法的第二个参数探究
Dec 05 Javascript
JS设置CSS样式的方式汇总
Jan 21 Javascript
jquery+css3实现熊猫tv导航代码分享
Feb 12 jQuery
解决vue项目nginx部署到非根目录下刷新空白的问题
Sep 27 Javascript
vue中的ref和$refs的使用
Nov 22 Javascript
Node.js assert断言原理与用法分析
Jan 04 Javascript
JS localStorage存储对象,sessionStorage存储数组对象操作示例
Feb 15 Javascript
Array.filter中如何正确使用Async
Nov 04 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
生成ubuntu自动切换壁纸xml文件的php代码
2010/07/17 PHP
php中如何防止表单的重复提交
2013/08/02 PHP
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
通过jquery实现tab标签浏览效果
2007/02/20 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
Javascript中的String对象详谈
2014/03/03 Javascript
javascript 解决浏览器不支持的问题
2016/09/24 Javascript
JS控件bootstrap datepicker使用方法详解
2017/03/25 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
移动端如何用下拉刷新的方式实现上拉加载
2018/12/10 Javascript
JavaScript中的惰性载入函数及优势
2020/02/18 Javascript
vue 修改 data 数据问题并实时显示操作
2020/09/07 Javascript
[00:14]护身甲盾
2019/03/06 DOTA
[03:30]完美盛典趣味短片 CSGO2019年度名场面
2019/12/07 DOTA
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
python实现梯度下降算法
2020/03/24 Python
python文件写入write()的操作
2019/05/14 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
python画环形图的方法
2020/03/25 Python
Keras官方中文文档:性能评估Metrices详解
2020/06/15 Python
CSS中垂直居中的简单实现方法
2015/07/06 HTML / CSS
雅诗兰黛旗下专业男士保养领导品牌:Lab Series
2017/05/15 全球购物
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
美国工业用品采购网站:Zoro.com
2020/10/27 全球购物
采购部岗位职责
2013/11/24 职场文书
安全保证书范文
2014/04/29 职场文书
商业计算机应用专业自荐书
2014/06/09 职场文书
学习焦裕禄观后感
2015/06/09 职场文书
居安思危观后感
2015/06/11 职场文书
三八节祝酒词
2015/08/11 职场文书
导游词之天下银坑景区
2019/11/21 职场文书
Golang 空map和未初始化map的注意事项说明
2021/04/29 Golang
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技