JS引擎之LHS RHS查询

    在书写代码的时候我们无时无刻不在与作用域较劲,而引擎是如何在沿着作用域链把我们想要的东西查找出来的呢?这里就涉及到了L与R的区别。

    通过字面意思就很容易理解L代表left R代表right,而LHS与RHS查询我们可以先简单的区分为:查询在 = 号左边的变量时,引擎使用LHS,查询在 = 右边的变量时,引擎使用RHS。LHS查询出来的是变量的地址,方便进行形如a = 2的赋值操作,因为引擎根本不需要关心a里面存的是什么鬼,按照程序猿的要求把2塞给a就可以了,而RHS查询出来的是变量存储的值,以便形如 a = b的赋值操作,引擎同样不需要关心 b 放在内存的哪个“格子”,只需要知道格子里面放的什么就可以了。

    当然, 根据 = 左右来区分LHS RHS是不全面的,因为我们很容易漏掉一些隐藏的LHS与RHS:

var c =3;
function a(b){
    console.log(b+c);
}
a(2);
    在上面一段代码中,我们可以很明显的得出 c ...使用了LHS,console.log()中的b、c使用了RHS,但是在调用函数a、console.log的时候同样使用了RHS,参数b的赋值也同样使用了LHS,所以 我们最好通过取值、取地址这两个行为来判断引擎使用的查询方式

    对于上面的代码,引擎与作用域是这样交流的:

    引擎:全局作用域,我想找一下c,你见过他么?

    全局作用域:嗨,别提了,编译器那小子刚刚声明了它,拿去吧!

    引擎:太棒了!我现在要把3丢给他

    引擎:等一下,还有一个事情想麻烦你一下,我想对a函数进行引用,你知道她在哪里么?

    全局作用域:就是那个跟c一起被丢进来的家伙把?喏,在这里呢,给你。

    引擎:哈哈,太感谢了,这样我只需要把2.....。

    a函数作用域:萨瓦迪卡,引擎,今天天气不错啊,一起出去玩吧!

    引擎:别提了,我手头上忙的要死,对了,你碰到过一个叫b的么?

    a函数作用域:哦,他是a函数的一个形参,我这刚好有,拿去用

    引擎:够哥们,这样我只需要把2放到b里面,之后.....哎,小a,console你有么

    a函数作用域:有有有,这是个内置对象,给你

    引擎:哈哈,你一直这么靠谱,我找找,哎呦,真有log这个函数,我得赶紧引用他

    引擎:你看我这脑子,你能在帮我找一下b么,我得确认一下b的内容

    a函数作用域:放心,看!b没有变过,放心

    引擎:那最好了,就差最后一步了,做完喝酒去,你那里有没有c,交出来我请你一包辣条!

    a函数作用域:真的么!我找找,嗯.....不行,我这里没有,你得去问问我大哥 全局作用域

    引擎:全局作用域,不好意思,又来找你了,不知道你有没有c,我拿辣条跟你换

    全局作用域:看你累的满头大汗的,辣条你自己留着吧,c给你,做完快歇歇吧

    引擎:么么哒,你最好了,晚上我请你吃饭!

    看完上面的对话,不知道你对LHS RHS是否有了足够的了解,还有一点需要注意的就是,当查找到全局作用域时,若还没有查找到要找的变量信息,若为LHS查询,会默认声明一个与请求的变量同名的全局变量,而RHS则会抛出错误,当然,在严格模式下,LHS也同样会报错,这是需要注意的地方。

你可能感兴趣的:(JS学习)