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 相关文章推荐
popdiv
Jul 14 Javascript
使用js正则控制input标签只允许输入的值
Jul 29 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
Jul 29 Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
Aug 11 Javascript
Eclipse配置Javascript开发环境图文教程
Jan 29 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
May 05 Javascript
Angular中管道操作符(|)的使用方法
Dec 15 Javascript
iView-admin 动态路由问题的解决方法
Oct 03 Javascript
JS求1到任意数之间的所有质数的方法详解
May 20 Javascript
ElementUI radio组件选中小改造
Aug 12 Javascript
vue.js实现图书管理功能
Sep 24 Javascript
一篇文章让你搞懂JavaScript 原型和原型链
Nov 23 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
PHP5中使用DOM控制XML实现代码
2010/05/07 PHP
PHP中的float类型使用说明
2010/07/27 PHP
Smarty变量调节器失效的解决办法
2014/08/20 PHP
Laravel框架FormRequest中重写错误处理的方法
2019/02/18 PHP
php和js实现根据子网掩码和ip计算子网功能示例
2019/11/09 PHP
关于Aptana Studio生成自动备份文件的解决办法
2009/12/23 Javascript
js输出列表实现代码
2010/09/12 Javascript
js设置function参数默认值(适合没有传参情况)
2014/02/24 Javascript
javascript中字符串拼接详解
2014/09/26 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
js表单登陆验证示例
2016/10/19 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
web.js.字符串与正则表达式操作
2017/05/13 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
一些手写JavaScript常用的函数汇总
2019/04/16 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
vue请求数据的三种方式
2020/03/04 Javascript
[06:13]DOTA2进化论(修改版)
2013/10/08 DOTA
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
python入门教程之识别验证码
2017/03/04 Python
python使用 __init__初始化操作简单示例
2019/09/26 Python
Python3.7安装keras和TensorFlow的教程图解
2020/06/18 Python
python NumPy ndarray二维数组 按照行列求平均实例
2019/11/26 Python
python dumps和loads区别详解
2020/02/04 Python
python的列表List求均值和中位数实例
2020/03/03 Python
利用Vscode进行Python开发环境配置的步骤
2020/06/22 Python
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
公司年夜饭通知
2015/04/25 职场文书
2015年“我们的节日·重阳节”活动总结
2015/07/29 职场文书
2016党员读书思廉心得体会
2016/01/23 职场文书
2016大学生国家助学贷款承诺书
2016/03/25 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书
2019年共青团工作条例最新版
2019/11/12 职场文书