作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。如果查找的目的是对变量进行赋值,则进行LHS查询,如果目的是获取变量的值,则进行RHS查询。赋值操作符会导致LHS查询。=操作符或调用函数时传入参数的操作都会导致关联作用域的赋值操作。JS引擎首先会在代码执行前对其进行编译,在这个过程中,像var a=2这样的声明会被分解成两个独立的步骤。
1.首先,var a在其作用域中声明新变量,这会在最开始的阶段,也就是代码执行前进行。
2.接着,a=2会查询(LHS查询)变量a并对其进行赋值。
LHS和RHS查询都会在当前作用域中开始,逐级向上查询,直到全局作用域(顶层),无论找不找得到都会停止。
不成功的RHS引用会导致ReferenceError异常。不成功的LHS引用会导致自动隐式地创建一个全局变量(非严格模式)