LHS与RHS查询(已完结)

LHS与RHS查询

  • 什么是LHS与RHS查询

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

考虑以下代码:

    console.log(a);

其中对a 的引用是一个RHS 引用,因为这里a 并没有赋予任何值。相应地,需要查找并取得a 的值,这样才能将值传递给console.log(..)

相比之下,例如:

    a = 2;

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

考虑下面的程序,其中既有LHS 也有RHS 引用:

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

最后一行foo(..) 函数的调用需要对foo 进行RHS 引用,意味着“去找到foo 的值,并把它给我”。并且(..) 意味着foo 的值需要被执行

代码中隐式的a=2 操作可能很容易被你忽略掉。这个操作发生在2 被当作参数传递给foo(..) 函数时,2 会被分配给参数a。为了给参数a(隐式地)分配值,需要进行一次LHS 查询。

这里还有对a 进行的RHS 引用, 并且将得到的值传给了console.log(..)。console.log(..) 本身也需要一个引用才能执行,因此会对console 对象进行RHS 查询,并且检查得到的值中是否有一个叫作log 的方法。

这里不会再对log进行RHS查询。因为对console查询完毕后,对象属性访问规则会接管对log属性的访问。类似的——foo.bar.baz也是一样的,对象属性访问规则会分别接管对bar 和baz 属性的访问

注意:在类似于var fun = function(){…}中,不会对右边的式子进行RHS查询,因为其本身就相当于一个值,这就类似于var fun = 2一样

  • LHS与RHS的差异

如果RHS 查询在所有嵌套的作用域中遍寻不到所需的变量,引擎就会抛出ReferenceError异常

相较之下,当引擎执行LHS 查询时,如果在顶层(全局作用域)中也无法找到目标变量,全局作用域中就会创建一个具有该名称的变量,并将其返还给引擎,前提是程序运行在非“严格模式”下(严格模式下变量必须先声明再赋值)。

考虑如下代码:

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

报错:ReferenceError: b is not defined

‘b=a’不是变量声明,预编译过程中不会将其提前

  • LHS与RHS查询标识符的路径

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

ps:本文参考并引用下列书籍
《你不知道的JavaScript》(上卷)

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值