版权声明:本文为博主原创文章,未经博主允许不得转载。
在写 js 代码的时,编译器在编译的时候生成了代码,引擎执行它时,会通过查找变量 a 来判断它是否已经声明过。查找的过程中需要通过作用域来协助,这时候引擎会为变量 a 进行 LHS 查询,另一种查询类型是 RHS 查询。及当变量出现在 “=” 的左侧的时进行 LHS 查询,出现在右侧时进行 RHS 查询。讲的更好理解一点,LHS 查询出来的是变量的地址,而 RHS 查询出来的是变量存储的值。
function foo(a){
console.log(a)
}
foo(2)
让我们把上面的代码处理成一段对话,来让我更加容易的去理解:
来自《你不知道的JavaScript》
引擎:我需要对foo进行RHS引用,你见过它吗?
作用域:别说,我还真见过,编译器那小子刚刚才编译了他,它是一个函数,给你。
引擎:哥们太够意思了!好吧,我来执行一下foo。
引擎:作用域,还有个事儿,我需要对a进行LHS引用,这个你见过吗?
作用域:这个也见过,编译器最近把它声明为foo的一个形式参数,拿去吧。
引擎:大恩不言谢啊,你总是那么棒,现在我要把2赋值给a。
引擎:哥们,不好意思,我又来了打扰你了。我要对console进行RHS引用,你见过它吗?
作用域:咱俩谁跟谁啊,再说我就是干这个,这个我也有,console是个内置对象,给你。
引擎:么么哒。我得看看这里面是不是有log(···),太好了,找到了,是个函数。
引擎:哥们,你能在帮我找找对a的RHS引用吗?虽然我记得它,但是我想再确认一下。
作用域:放心吧,这个变量没有动过,拿走,不谢。
引擎:真棒!我来把a的值,也就是2传递进log(..)
······