简单来说,未声明的变量在编译的过程中,被判断为LHS
- 在非严格模式中,LHS会自动的将未声明的赋值目标在全局注册,
- 严格模式则会报错,即引用错误,RHS则不同,它不管在任何模式下,只要有未查询到未声明的目标的情况,都会报引用错误
ReferenceError
那么,什么是LHS,什么是RHS呢?
简单来说,就是当一个赋值操作发生时,LHS是等号左边的查询方法,RHS是等号右边的查询方法,当代码被编译后,引擎会使用不同的查询方法去查找作用域获取对应数据,
例如一下代码
var a = 2;
var b = a + 2
在执行 var a = 2 时,引擎会查询变量a,如果当前作用域不存在变量a,编译器则会要求作用域在当前作用域的集合中声明一个变量,并命名为a,如果存在变量a,则忽略,然后根据编译的结果?,a在赋值操作的左边(赋值的目标),所以查询方法是LHS
而代码 var b = a + 2 中, 引擎在查询这里的a时,则会用RHS,因为这里的a在等号的右边,又或者说a是声明b的数据源头之一
总结一下,LHS和RHS概念上最好将其理解为“赋值操作的目标是谁(LHS)”, 以及“谁是赋值操作的源头 (RHS)”
小练习:
答案