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

 更新时间:2017年08月24日 09:21:05   作者:码农技术宅  
本篇文章主要介绍了快速理解 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 异常(严格模式下)。

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

相关文章

  • uniapp movable-area应用

    uniapp movable-area应用

    这篇文章主要为大家介绍了uniapp movable-area应用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • JS target与currentTarget区别说明

    JS target与currentTarget区别说明

    target在事件流的目标阶段;currentTarget在事件流的捕获,目标及冒泡阶段。只有当事件流处在目标阶段的时候,两个的指向才是一样的,而当处于捕获和冒泡阶段的时候,target指向被单击的对象而currentTarget指向当前事件活动的对象(一般为父级)。
    2011-08-08
  • Javascript仿PHP $_GET获取URL中的参数

    Javascript仿PHP $_GET获取URL中的参数

    这篇文章主要介绍了Javascript仿PHP $_GET获取URL中的参数代码实例,需要的朋友可以参考下
    2014-05-05
  • JavaScript 中获取数组最后一个元素方法汇总

    JavaScript 中获取数组最后一个元素方法汇总

    在JavaScript中,获取数组最后一个元素的方法有很多种。今天我们就来汇总一下JavaScript获取数组最后一个元素的几种方法,需要的朋友可以参考下
    2023-02-02
  • egg.js的基本使用和调用数据库的方法示例

    egg.js的基本使用和调用数据库的方法示例

    这篇文章主要介绍了egg.js的基本使用和调用数据库的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • JavaScript中的JSON转为Python可读取

    JavaScript中的JSON转为Python可读取

    本文主要介绍了JavaScript中的JSON转为Python可读取,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • JavaScript中的函数式编程详解

    JavaScript中的函数式编程详解

    这篇文章主要介绍了JavaScript中的函数式编程详解,需要的朋友可以参考下
    2020-08-08
  • 微信小程序实现树莓派(raspberry pi)小车控制

    微信小程序实现树莓派(raspberry pi)小车控制

    这篇文章主要为大家详细介绍了微信小程序实现树莓派(raspberry pi)小车控制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • JS实现点击按钮自动增加一个单元格的方法

    JS实现点击按钮自动增加一个单元格的方法

    这篇文章主要介绍了JS实现点击按钮自动增加一个单元格的方法,实例分析了javascript操作表格单元格的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • js对url进行编码解码的三种方式总结

    js对url进行编码解码的三种方式总结

    为一个字符串进行URL编码很容易,只需要调用encodeURI,传入要编码的字符串即可,而且实现的方法不止这一个,下面这篇文章主要给大家介绍了关于js对url进行编码解码的三种方式,需要的朋友可以参考下
    2023-02-02

最新评论