JavaScript中的LHS和RHS查询

article/2025/10/25 9:48:10

文章是本人大三期间的学习笔记,一些论断取自书籍和网上博客,碍于当时的技术水平有一些写得不够好的地方,可以在评论处理智讨论~

问题来源于《你不知道的JavaScript(上卷)》,文章部分论述截自原书。

简述编译原理


JavaScript通常会被归类为“动态”或“解释执行”语言,但事实上它是一门编译语言。但与传统的编译语言不同,它不是提前编译的,编译结果也不能在分布式系统上进行移植

在传统编译语言的流程中,程序中的一段源代码在执行前会经历三个步骤,统称为“编译”。

  1. 分词 / 词法分析
  2. 解析 / 语法分析
  3. 代码生成

与其他语言不同,JavaScript的编译过程不是发生在构建之前的。对于JavaScript来说,大部分情况下编译发生在代码执行前的几微秒(甚至更短)的时间内

举个栗子,var a = 2; JavaScript引擎会将它分为几步完成呢?
  答案是两步,JavaScript 会将其看成两句声明:var a;a = 2;。第一个定义声明在编译阶段进行,第二个赋值声明会被留在原地等待执行阶段。

下面是原书对这句声明的拆解分析:

变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后在运行时引擎会在引用域中查找该变量,如果能够找到就会对它赋值。

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

LHS 和 RHS


LHS(Left-hand Side)引用和RHS(Right-hand Side)引用。通常是指等号(赋值运算)的左右边的引用。
我们来看下面这句代码:

console.log(a);

这里对a的引用是一个RHS引用,因为这里a并没有赋予任何值,我们只是想查找并取得a的值,然后将它打印出来。

a = 2;

这里对a的引用是一个LHS引用,因为我们并不关心当前的值是什么,只是想要为赋值操作找到目标

注:LHS和RHS的含义是“赋值操作的左侧和右侧”并不一定意味这就是"="的左侧和右侧。赋值操作还有其他几种形式,因此在概念上最好将其理解为“赋值操作的目标是谁(LHS)以及“谁是赋值操作的源头(RHS)”。

这里再举一个较复杂的例子:(找出所有的LHS查询和所有的RHS查询

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

这里一共有3个LHS查询和4个RHS查询,这里我们都来做个分析。

LHS:

  1. 第6行的 c = ...,c 在赋值操作的左边,所以对 c 需要 LHS 查询。
  2. 隐藏着的 a = 2(隐式变量分配),在调用 foo(2) 时,需要将实参2赋值给形参a,所以对 a 需要 LHS 查询。
  3. 第2行的b = ..., 解释同 1。

RHS:

  1. 第6行的 c = foo(2),foo(2) 在赋值操作的右边,需要知道 foo(2)的值,对 foo(2) 需要 RHS 查询。
  2. 第2行的b = a, a 在赋值操作的右边,需要知道 a的值,对 a 需要 RHS 查询。
  3. 第3行的 reutrn a + b;, 需要知道 a 和 b 的值, 分别对 a 和 b 都进行 RHS 查询。

小结:如果查找的目的是对变量进行赋值,那么就会使用LHS查询
   如果目的是获取变量的值,就会使用RHS查询

区分 LHS 和 RHS 的重要性


因为在变量还没有声明(在任何作用域中都无法找到该变量)情况下,这两种查询行为是不一样的。

LHSRHS 查询都会在当前执行作用域中开始,如果有需要(也就是说他们没有找到所需的标识符),就会向上级作用域继续查找目标标识符,这样每次上升一次作用域,最后抵达全局作用域,无论找到或没找到都将停止。

借用书中的一张图,将作用域链比喻成一个建筑,在对上面的论述进行一次转换。
(对作用域链的具体介绍可以移步 理解 JavaScript 的作用域链)

这个建筑代表储蓄中的嵌套作用域链。第一层楼代表当前的执行作用域,也就是你所在的位置。建筑的顶层代表全局作用域。

LHS 和 RHS 引用都会在当前楼层进行查找,如果没有找到,就会坐电梯前往上一层楼,如果还是没有找到就继续向上,以此类推。一旦抵达顶层(全局作用域),可能找到了你所需的变量,也可能没找到,但无论如何查找过程都将停止。

总结:不成功的RHS引用会导致抛出 ReferenceError 异常。不成功的LHS引用会导致自动隐式地创建一个全局变量非严格模式下),该变量使用LHS引用的目标作为标识符,或者抛出 ReferenceError 异常严格模式下)。


http://chatgpt.dhexx.cn/article/TLWsikTH.shtml

相关文章

drools rule (二) LHS语法详解

1.什么是LHS? 左手边(LHS)是规则的条件部分的通用名称。它由零个或多个条件元素组成。如果LHS为空,则它将被视为始终为true的条件元素,并且在创建新的WorkingMemory会话时将激活一次。 rule "no CEs" when…

ls -lh

ls -lh 可以在列出文件的同时查看文件的大小

拉丁超立方体抽样(LHS)研究(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

linux查看端口和pid

一.查看进程常用操作 netstat说明: netstat命令参数: -t : 指明显示TCP端口   -u : 指明显示UDP端口   -l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序)   -p : 显示进程标识符和程序名称&#xf…

Linux 查看已使用的端口

指定端口 已开放: 未开放: 查看所有端口 完!

Linux查看端口使用情况并开启端口

一、查看端口是否被使用 方法一: lsof -i:8050 方法二 telnet测试命令: telnet ip地址 端口 方法三: netstat -tlnp|grep 8050 方法四:如果是防火墙已开启的状态查看已经开放的端口 firewall-cmd --list-ports 查看防火墙状…

linux查看端口TCP连接情况

netstat -ano | grep 19833 #查看19833端口的连接情况 从上图结果可以分析出一些信息: 1、第一个为服务器的监听套接字,其监听队列中存在两个连接未处理,而整个服务器连接到19833端口的连接才3个。 2、其中源主机端口为37534和37532的…

Linux查询端口命令

一、使用netstat 检查端口 netstat是一个命令行工具,可以提供有关网络连接的信息。 显示所有已开放端口,请使用以下命令:netstat -anp 要列出正在侦听的所有 TCP 或 UDP端口,包括使用端口和套接字状态的服务,请使用以下…

linux 端口号查看

用netstat检查监听端口 sudo netstat -tunlp 此命令中使用的选项具有以下含义: -t-显示TCP端口。 -u -显示UDP端口。 -n -显示数字地址而不是解析主机。 -l -仅显示监听端口。 -p -显示侦听器进程的PID和名称。仅当你以root用户或 sudo 用户身份运行命令时&#xf…

Linux查看端口是否开放

linux查看开放端口的方法: 1. 使用rpm安装nmap工具,执行 "nmap 127.0.0.1" 命令查看本机开放的端口 2. 执行 "netstat -anp" 命令进行查看开放的端口 3. 使用rpm安装slof工具,执行 "lsof -i:8085" 命令查看…

linux如何查看端口被哪个进程占用

亲测可用,若有疑问请私信 本文介绍linux如何查看端口被哪个进程占用的方法: 1、lsof -i:端口号 2、netstat -tunlp|grep 端口号 都可以查看指定端口被哪个进程占用的情况 【步骤一】lsof -i lsof -i 用以显示符合条件的进程情况,lsof(l…

Linux如何查看端口状态

在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放这些端口的具体进程和用户,可以通过netstat命令进行简单查询 netstat命令各个参数说明如下: -t : 指明显示TCP端口 -u : 指明显示UDP端口 -l : 仅显示监听套接字…

linux 查看端口状态

netstat -tunlp | grep 端口号 1、netstat -tunlp 是查看所有的在使用的端口号情况 2、netstat -tunlp | grep 端口号是查看所查询的端口号情况 3、netstat -tunlp各个参数说明如下: -t:(tcp)仅显示TCP相关端口 -u:…

Linux常用查看端口号命令

Linux 查看端口占用情况可以使用 lsof 和 netstat 命令。 注意:lsof 用普通用户--权限等同于root 可以使用;netstat 命令普通用户不行,必须是root用户,sudo netstat lsof lsof (list open files) 是一个列出当前系统打开文件的…

Linux查看端口占用情况的几种方式

概述 测试环境为Centos7.9,本文简单给出了几种检测端口的例子。 一、查看本机端口占用 1、netstat #安装netstat yum -y install net-tools #检测端口占用 netstat -npl | grep "端口"2、lsof #安装lsof yum -y install lsof #检测端口占用 lsof -i …

Linux 查看端口常用命令

大家好啊,我是大田。 有时部署测试环境会发现有启动失败的情况,做压测时需要查询某程序的端口占用情况或者根据端口号查看是哪个程序,同时也是面试中常问的两个命令,今天来记录下: 1、根据程序名称,查找占用…

linux如何查看端口是否开放

linux查看端口是否开放的方法:首先打开端口,切换root用户登录;然后使用【lsof -i:】端口号命令行;最后使用【netstat -aptn】命令行,查看所有开启的端口号。 本教程操作环境:linux7.3系统,DELL…

Linux查看端口详情

无论您是使用 Linux 作为服务器还是桌面环境,了解开放的端口或正在使用的端口在各种情况下都会有所帮助。哪个端口被哪个服务占用?有多少个开放端口?本文介绍如何扫描 Linux 系统或任何远程系统上开放的端口。 例如,如果您正在运…

linux查看服务端口命令大全

目录: 零、 linux怎么查看所有服务端口一、常用命令二、lsof -i 需要 root 用户的权限来执行三、netstat命令四、扩展资料 零、 linux怎么查看所有服务端口 1、打开linux系统,在linux的桌面的空白处右击。 2、在d出的下拉选项里,点击打开终端…

linux查看端口

linux中netstat netstat -a : 将目前系统上所有的连接、监听、socket信息都列出来 -t :列出tcp网络封包的信息 -u :列出udp网络封包的信息 -n :不以进程的服务名称,以端口号来显示 -l :列出目前正在网络监听的服务 -p…