什么是RHS、LHS
这是两种查询变量的方式
- RHS
- “=”右边的动作,获取 “ = ” 右边语句的值
- 其实,任何获取变量的值的查询,都是RHS
- LHS
- “ = ”左边的动作
- 找到存放变量存放的容器本身,然后把获取到的值放进去
- 其实,任何对变量赋值的查询,都是LHS
举个例子
function foo(a) {
console.log( a ); // 2
}
foo( 2 );
你知道,其中哪些进行了RHS,哪里进行了LHS吗
这里我们讲的是执行过程,不是编译过程
-
foo函数调用,需要找到foo所指向的函数的值。所以这里是RHS -
foo函数执行时,传入了一个参数,这个参数由形参a接收。a的值被赋为2。所以这里是LHS -
函数内部的
console.log( a )执行语句,这里分成两部分来看。- 第一部分找到
console.log函数,console是LHS查询,而.log是原型链规则查询,既不属于LHS,也不属于RHS。 - 第二部分传入
a这个形参。该过程要获取a的值,所以是RHS。之后会将该值赋给console.log()的参数,所以是LHS。也就是说,这里即发生了RHS,也发生了LHS
- 第一部分找到
为什么区分LHS和RHS是一件很重要的事情
-
当JS引擎做LHS查询的时候,如果当前作用域没有声明该变量,就会继续往外面的作用域继续查找,一只查到全局作用域,如果全局作用域也没有该变量,就会在全局作用域中声明该变量
-
做RHS查询的时候,只是关心该变量的值,会顺着作用域链一直查询。如果到全局作用域都没有查到该变量,就会抛出
ReferenceError异常 -
也就是说,只有LHS查询会执行在作用域中声明变量的操作,而RHS不会(这个我们要特别注意)
区分RHS和LHS的技巧
想想JS引擎在执行过程中,需要的是变量的值,还是变量的容器
我们在再做一个练习
下面的代码,在执行过程中的查询,哪些是LHS,哪些是RHS
function foo(a) {
var b = a;
return a + b;
}
var c = foo( 2 );
答案:
LHS查询(这里有3处!)
- c= ..;、
- a= 2(隐式变量分配)、
- b= ..
RHS查询(这里有4处!)
- foo(2..、
- = a;、
- a..、
- ..b
进阶应用可以查看函数表达式一章节
总结
- 什么是LHS查询、RHS查询
- 为什么我们要做这样的一个区分
- 区分RHS和LHS的技巧
- 进阶应用可以查看函数表达式一章节
- 文章这么精彩不点个赞么,球球宁了