PhoneGap中文网

 找回密码
 立即注册
查看: 17115|回复: 0
打印 上一主题 下一主题

JavaScript 中的 LHS 和 RHS 查询

[复制链接]

87

主题

87

帖子

327

积分

中级会员

Rank: 3Rank: 3

积分
327
跳转到指定楼层
楼主
发表于 2017-8-14 15:53:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

本文和大家分享的主要是javascript中LHS 和 RHS 查询相关内容,一起来看看吧,希望对大家学习javascript有所帮助。
  简述编译原理
  · JavaScript 程序中的一段源代码在执行之前会经历三个步骤,统称为 编译
  1. 分词/词法分析
  2. 解析/语法分析
  3. 代码生成
  · 先看原书对一个赋值操作的拆解说明:
  变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后在运行时引擎会在作用域中查找该变量,如果能够找到就会对它赋值。
  · 而要讲的 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 查询
<!--more-->
  答案:
  1. LHS 查询:
  · c = ..;
  · a = 2(隐式变量分配)
  · b = ..
  1. RHS 查询
  · foo(2..
  · = a;
  · a ..
  · .. b
  小结
  · 作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。
  · 如果查找的目的是对变量进行赋值,就会使用 LHS 查询;如果目的是获取变量的值,就会用 RHS 查询。
  · 赋值操作 会导致 LHS 查询。 = 操作符 或调用函数时传入参数的操作都会导致关联作用域的赋值操作 , 即都会导致 LHS 查询。
  ·JavaScript 引擎首先会在代码执行前对其进行编译,在这个过程中,像 var a = 2 这样的声明会被分解成两个独立的步骤:
  1. 首先, var a 在其作用域中声明新变量。这会在最开始的阶段,也就是代码执行前进行。
  2. 接下来, a = 2 会查询(LHS查询)变量 a 并对其进行赋值。
  · LHS 和 RHS 查询都会在当前执行作用域中开始,如果有需要(也就是说它们没有找到所需的标识符),就会向上级作用域继续查找目标标识符,这样每次上升一级作用域,最后到达全局作用域,无论找到或没找到都将停止。
  · 不成功的 RHS 引用会导致抛出 ReferenceError 异常。不成功的 LHS 引用会导致自动隐式地创建一个全局变量(非严格模式下),该变量使用 LHS 引用的目标作为标识符,或者抛出 ReferenceError 异常(严格模式下)。


来源:SegmentFault
it营
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

ionic4视频教程

Archiver|手机版|小黑屋| PhoneGap中文网 ( 京ICP备13027796号-1 )  

GMT+8, 2024-4-25 12:53 , Processed in 0.038909 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表