【问题标题】:JavaScript LHS and RHS LookupJavaScript LHS 和 RHS 查找
【发布时间】:2016-04-03 09:39:19
【问题描述】:

我正在阅读 Kyle Simpson 的《你不知道 JS 的范围和闭包》一书,特别是这个主题 Compiler Speak

他们提到了 LHS 和 RHS 查找。我无法理解这两个术语,任何人都可以帮助我实现它们吗?

【问题讨论】:

标签: javascript lookup


【解决方案1】:

当变量出现在赋值操作的左侧时进行 LHS 查找,而当变量出现在赋值操作的右侧时进行 RHS 查找。

我认为是这样的:
lhs 查找是一个容器查找
rhs 查找是一个值查找

【讨论】:

    【解决方案2】:

    不要将其视为左侧或右侧赋值,将其视为将值存储到内存中并稍后检索。

    例如,当您在 chrome 开发者控制台中键入 b 时,它会启动 RHS 查找(检索 b 的值),如果找不到该值,则会抛出 ReferenceError

    相比之下,当你在chrome开发者控制台输入b = 2时,它会启动LHS查找,如果在嵌套范围内找不到b,JS编译器会在全局范围内声明它(取决于你是否在运行strict mode 中的代码)。

    例如考虑以下代码

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

    JS 编译器在执行代码时首先查找函数foo 以及是否声明在当前作用域(此处为Hosting Environment),称为RHS 查找。现在在 foo 的范围内,参数将是 2,并且当我们在编写 foo( 2 ) 时声明函数 foo(a) 时,我们将值 2 隐式分配给 aa = 2,这称为 LHS 查找(将值2 分配给a),现在快进编译器将再次到达console.log( a + b) 行,它将查找值ab(再次查找RHS)并且如果值是发现它会将其分配给console.log 参数(如果您假设console.log 在托管环境中定义为console.log(arg1),那么arg1 = value of a+b(这又是LHS 查找)。

    简而言之:

    • 当引擎检索变量console.log(b) 的值时,它会从b 的内存位置获取值。这是RHS 查找

    • 当引擎将值分配给变量b = 2 时,它会在范围内查找b 的值——如果找到,它会在b 的内存位置设置值2,如果不,它在上层范围内查找。这是LHS 查找。

    【讨论】:

      【解决方案3】:

      您提到的同一本书中的简单示例

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

      LHS :当您将 value(2) 传递给 foo 方法时,编译器会将参数分配为 a = 2 ,称为 LHS 查找。它会简单地找到一个容器变量来分配值。

      RHS :为了执行console.log 打印a,需要a 的值的RHS 参考。它被称为 RHS 查找

      另一个例子

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

      3 LHS来自上面的例子 -**

      1. c =(存放 foo 方法返回的容器)
      2. a = 2(当您将值 2 传递给方法时,编译器将分配 a = 2)
      3. b =

      上述代码 sn-p 的 4 个 RHS

      1. foo(2) - 需要 a 的引用来获取值
      2. = a - 要获得 b 的值,需要 a 的引用
      3. a - 要获得 a 的值,需要 a 的引用
      4. b - 要获得 b 的值,需要 b 的引用

      编辑:

      【讨论】:

      • 我喜欢这个答案
      【解决方案4】:

      LHS - 查找用于分配目的或为其分配值的标识符。

      let foo;
      
      // It's looking for foo identifier in global scope and assign value
      // So it's an LHS 
      foo = 1; 
      
      // It's also LHS as it assigning new value
      foo = 2;
      

      现在,RHS - 这意味着当您正在寻找使用它的标识符时(而不是分配值)

      function foo() {
          alert(2);
      }
      
      // this look for an identifier called foo and 
      // in global scope it's a function decoration 
      // and execute it
      foo();
      

      【讨论】:

        【解决方案5】:

        我认为是这样的: lhs 查找是容器查找 rhs 查找是一个值查找

        我非常喜欢 Kyle Simpson 的方法,但这个特别的简明扼要的解释让我明白了这一点。

        “只说我需要知道的,仅此而已”与深入了解以更深入地了解之间总是存在权衡。

        有时,深入了解可以帮助您避免麻烦,如何调试、编写测试代码、优化和重构。

        我目前正在阅读和观看很多凯尔的写作和在线教学,他确实有很好的解释事情的诀窍。很多教练会因为速度太快而失去人,因为他们有专业知识,而且他们很难放慢速度 - 另一方面,如果你太基本,谈话就会变得无趣,你就会调出来。

        【讨论】:

          【解决方案6】:

          或简称:

          RHS - 用于读取查找

          LHS - 用于写查找

          【讨论】:

            猜你喜欢
            • 2018-10-18
            • 1970-01-01
            • 1970-01-01
            • 2021-07-19
            • 1970-01-01
            • 1970-01-01
            • 2018-08-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多