全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

快速理解 JavaScript 中的 LHS 和 RHS 查询的用法

JavaScript 程序中的一段源代码在执行之前会经历三个步骤,统称为 编译

  • 分词/词法分析
  • 解析/语法分析
  • 代码生成

先看原书对一个赋值操作的拆解说明:
变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后在运行时引擎会在作用域中查找该变量,如果能够找到就会对它赋值。 --- 《你不知道的JavaScript(上卷)》 P7

而要讲的 LHS 和 RHS 就是上面说的对变量的两种查找操作,查找的过程是由作用域(词法作用域)进行协助,在编译的第二步中执行。

LHS 和 RHS

  • 字面意思其实是 Left Hand Side Right Hand Side 即左手边和右手边
  • 一般可以理解为 赋值操作的左侧和右侧

先看个例子一

console.log(a);

这里对 a 是一个 RHS 引用,因为 a 并没有赋予任何值,目的是为了取到 a 的值并打印出来。

a = 2;

这里对 a 是一个 LHS 引用,因为实际上我们不关心当前的值是什么,只是想要把 a 赋值为 2。

再看例子二

function foo(a) {
  console.log(a); // 2
}
foo(2);
  • 最后一行foo(..)函数的调用需要对 foo 进行 RHS 引用,意味着是取到 foo 的值,并且 (..)意味着 foo 需要被执行,因此它最好是一个函数类型的值
  • 其中有一个容易被忽略的隐式赋值操作 a = 2,它发生在 2 被当做实参传入 foo 中时。即实参 2 传给了形参 a,需要一个 LHS 查询
  • console 那一行还有对 a 的一次 RHS 引用(或者叫查询),同时console.log(..)本身也需要一个 RHS 引用,即对 console 对象进行 RHS 查询,并且检查得到的值中是否有一个叫做 log 的方法。
  • 书中有一段引擎和作用域的对话,有助于很好的理解例子二,see YDKJS github

小测验

function foo(a) {
  var b = a;
  return a + b;
}
var c = foo(2);

试试找出其中的3处 LHS 查询,4处 RHS 查询

答案:

LHS 查询:

c = ..;
a = 2(隐式变量分配)
b = ..

RHS 查询

foo(2..
= a;
a ..
.. b

小结

参考原书中文版P12,英文版见 github

  • 作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。
  • 如果查找的目的是对变量进行赋值,就会使用 LHS 查询;如果目的是获取变量的值,就会用 RHS 查询。
  • 赋值操作会导致 LHS 查询。 = 操作符或调用函数时传入参数的操作都会导致关联作用域的赋值操作, 即都会导致 LHS 查询。
  • JavaScript 引擎首先会在代码执行前对其进行编译,在这个过程中,像var a = 2 这样的声明会被分解成两个独立的步骤:
  • 首先,var a在其作用域中声明新变量。这会在最开始的阶段,也就是代码执行前进行。
  • 接下来,a = 2会查询(LHS查询)变量 a 并对其进行赋值。
  • LHS 和 RHS 查询都会在当前执行作用域中开始,如果有需要(也就是说它们没有找到所需的标识符),就会向上级作用域继续查找目标标识符,这样每次上升一级作用域,最后到达全局作用域,无论找到或没找到都将停止。
  • 不成功的 RHS 引用会导致抛出 ReferenceError 异常。不成功的 LHS 引用会导致自动隐式地创建一个全局变量(非严格模式下),该变量使用 LHS 引用的目标作为标识符,或者抛出 ReferenceError 异常(严格模式下)。

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


# JavaScript  # LHS和RHS查询  # LHS  # RHS  # JavaScript的查询机制LHS和RHS解析  # JavaScript中的LHS和RHS分析详情  # 会在  # 是一个  # 就会  # 对其  # 隐式  # 不成功  # 抛出  # 原书  # 有一个  # 很好  # 在这个  # 目的是  # 模式下  # 是由  # 两种  # 所需  # 都将  # 书中  # 再看  # 会用 


相关文章: 无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  如何在Windows虚拟主机上快速搭建网站?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  已有域名如何免费搭建网站?  视频网站制作教程,怎么样制作优酷网的小视频?  定制建站如何定义?其核心优势是什么?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Python多线程使用规范_线程安全解析【教程】  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  如何在IIS7上新建站点并设置安全权限?  宁波自助建站系统如何快速打造专业企业网站?  内部网站制作流程,如何建立公司内部网站?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  建站之星如何取消后台验证码生成?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  如何在景安云服务器上绑定域名并配置虚拟主机?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  制作网站外包平台,自动化接单网站有哪些?  微信推文制作网站有哪些,怎么做微信推文,急?  如何彻底卸载建站之星软件?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  如何通过.red域名打造高辨识度品牌网站?  如何快速生成高效建站系统源代码?  外贸公司网站制作哪家好,maersk船公司官网?  威客平台建站流程解析:高效搭建教程与设计优化方案  如何正确选择百度移动适配建站域名?  宝塔建站助手安装配置与建站模板使用全流程解析  如何用PHP快速搭建高效网站?分步指南  活动邀请函制作网站有哪些,活动邀请函文案?  重庆市网站制作公司,重庆招聘网站哪个好?  如何快速生成橙子建站落地页链接?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  已有域名如何快速搭建专属网站?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  建站主机系统SEO优化与智能配置核心关键词操作指南  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  电商网站制作价格怎么算,网上拍卖流程以及规则?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  建站之星代理如何获取技术支持?  如何零成本快速生成个人自助网站?  建站之星2.7模板:企业网站建设与h5定制设计专题  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  如何用已有域名快速搭建网站?  如何快速搭建FTP站点实现文件共享?  ,巨量百应是干嘛的?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。