LHS与RHS查询

LHS与RHS查询JavaScript 中在预编译后执行代码时对变量的查询分为 LHS Left Hand Side 查询和 RHS Right Hand Side 查询 是一个赋值操作的左侧和右侧的意思 一 看一个转换后的例子 functionfoo a console log a 2 foo 2 让我们把上面这段代码的处理过程想象成一段对话 这段对话可能是下面这样的 引擎

本文基于《你不知道的Javascript》编写。

JavaScript中在预编译后执行代码时对变量的查询分为LHS(Left-Hand-Side)查询和RHS(Right-Hand-Side)查询。
是一个赋值操作的左侧和右侧的意思;

(一)看一个转换后的例子:

function foo(a) { 
    console.log( a ); // 2 } foo( 2 ); 

代码执行原理图解:
图解

(二)我的分析

示例:

  1. 找到其中所有的 LHS 查询。
  2. 找到其中所有的 RHS 查询。
function foo(a) { 
    var b = a; return a + b; } var c = foo( 2 ); 

分析:

 (1)var c = foo( 2 );入手. c的赋值操作需要对c进行一次LHS查询,foo(2)需要进行一次RHS查询,去获取 foo(2) 的值. (2)进入函数声明,foo(a){ 
   },这里有一个隐式赋值操作, 需要对a进行一次LHS查询,判断作用域中是否存在名为a的变量,若存在则直接赋值a=2; 若不存在,如果是严格模式下,则报ReferenceError:a is not defined. 如果非严格模式,则创建一个a的全局变量,并直接赋值a=2; (3)var b = a;需要对b进行一次LHS查询,以及对a进行一次RHS查询以获得a的值; (4)return a + b;需要分别对a和b进行RHS查询; 

(三)为什么区分 LHS 和 RHS 是一件重要的事情?

function foo(a) { 
    console.log( a + b ); b = a; }foo( 2 ); 

(四)小结

  • 作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。
  • 如果查找的目的是对变量进行赋值,就会使用 LHS 查询;如果目的是获取变量的值,就会用 RHS 查询。
  • 赋值操作会导致 LHS 查询。 = 操作符或调用函数时传入参数的操作都会导致关联作用域的赋值操作, 即都会导致 LHS 查询。
  • JavaScript 引擎首先会在代码执行前对其进行编译,在这个过程中,像var a = 2 这样的声明会被分解成两个独立的步骤:
    1.首先,var a在其作用域中声明新变量。这会在最开始的阶段,也就是代码执行前进行。
    2.接下来,a = 2会查询(LHS查询)变量 a 并对其进行赋值。




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

  • 不成功的 RHS 引用会导致抛出 ReferenceError 异常。不成功的 LHS引用会导致自动隐式地创建一个全局变量(非严格模式下),该变量使用 LHS 引用的目标作为标识符,或者抛出ReferenceError异常(严格模式下)。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214759.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午3:31
下一篇 2026年3月18日 下午3:31


相关推荐

  • Pycharm中Python Interpreter显示Nothing to show

    Pycharm中Python Interpreter显示Nothing to show解决 Pycharm 中无法配置解释器 且 PythonInterp 显示 Nothingtosho 的问题

    2026年3月27日
    2
  • C语言 const和指针

    C语言 const和指针关键字 const 用来定义常量 如果一个变量被 const 修饰 那么它的值就不能再被改变 1 修饰变量 constinta 5 intconsta 5 上面这两种写法都一样 都是表示变量 n 的值不能被改变了 需要注意的地方是 用 const 修饰变量时 一定要给变量初始化 否则之后就不能再进行赋值了 例如下面这个例子 constinta a 5

    2026年3月18日
    2
  • 使用netron实现对onnx模型结构可视化

    使用netron实现对onnx模型结构可视化很多时候 复现人家工程的时候 需要了解人家的网络结构 但不同框架之间可视化网络层方法不一样 这样给研究人员造成了很大的困扰 前段时间 发现了一个可视化模型结构的 shen Netron

    2026年3月26日
    2
  • OpenClaw安装、配置与钉钉接入全流程

    OpenClaw安装、配置与钉钉接入全流程

    2026年3月12日
    4
  • WEP网络激活成功教程

    WEP网络激活成功教程先将网卡设置为监听模式 airmon ngstartwlan0 输入 airodump ngwlan0mon 可查看 Wi Fi 范围内的所有网络输入 airodump ngbssidMAC 地址 channel11wri 保存的文件在当前目录下你会发现当前目录多出了 4 个文件这些文件的开头是 wep 开始攻击这 4 个文件中那个扩展名为 cap

    2026年3月19日
    2
  • 浅谈JPA优缺点_sql优点

    浅谈JPA优缺点_sql优点一.JPA的理解JPA的总体思想和现有hibernate、TopLink,JDO等ORM框架大体一致。总的来说,JPA包括以下3方面的技术:ORM映射元数据,JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;JPA的API,用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和…

    2022年10月20日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号