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类后台管理菜单类-MenuSwitch
Sep 12 Javascript
jQuery toggle()设置CSS样式
Nov 05 Javascript
JQuery 表单中textarea字数限制实现代码
Dec 07 Javascript
基于jQuery的Tab选项框效果代码(插件)
Mar 01 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
Feb 20 Javascript
BootStrap入门教程(三)之响应式原理
Sep 19 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
Jun 01 Javascript
AjaxUpLoad.js实现文件上传
Mar 05 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
Oct 26 Javascript
Vue+Element自定义纵向表格表头教程
Oct 26 Javascript
JavaScript手写数组的常用函数总结
Nov 22 Javascript
Vue常用API、高级API的相关总结
Feb 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 删除数组元素
2009/01/16 PHP
PHP中常用的输出函数总结
2014/09/22 PHP
php中解析带中文字符的url函数分享
2015/01/20 PHP
php实现字符串反转输出的方法
2015/03/14 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
jQuery 使用手册(四)
2009/09/23 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
js函数调用的方式
2014/05/06 Javascript
简单了解JavaScript操作XPath的一些基本方法
2016/06/03 Javascript
JS中parseInt()和map()用法分析
2016/12/16 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
Vue v2.4中新增的$attrs及$listeners属性使用教程
2018/01/08 Javascript
微信小程序开发背景图显示功能
2018/08/08 Javascript
模块化react-router配置方法详解
2019/06/03 Javascript
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
[48:32]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs VG
2018/04/01 DOTA
Python脚本处理空格的方法
2016/08/08 Python
详解Python Opencv和PIL读取图像文件的差别
2019/12/27 Python
基于Tensorflow批量数据的输入实现方式
2020/02/05 Python
Python实现的北京积分落户数据分析示例
2020/03/27 Python
python pillow库的基础使用教程
2021/01/13 Python
HTML5标签使用方法详解
2015/11/27 HTML / CSS
NBA德国官方网上商店:NBA Store德国
2018/04/13 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
医院领导班子整改方案
2014/10/01 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
干部作风建设年活动剖析材料
2014/10/23 职场文书
2014年干部培训工作总结
2014/12/17 职场文书
政协委员个人总结
2015/03/03 职场文书
PL350与SW11的比较
2021/04/22 无线电
晶体管来复再生式二管收音机
2021/04/22 无线电
Python函数中的不定长参数相关知识总结
2021/06/24 Python
JavaScript中MutationObServer监听DOM元素详情
2021/11/27 Javascript