RHS和LHS查找 异常

作用域是一套规则,用于确定在何处以及如何查找变量(标识符)。如果查找的目的是对变量进行赋值,农民就会使用LHS查询;如果目的是获取变量的值,就会使用RHS查询。

JavaScript引擎首先会在代码执行前对其进行编译,在这个过程中,像 var a =2这一点声明会被解析成两个独立的步骤:

  1. 首先,var a 在其中作用域中声明新变量。这是在代码执行前进行。
  2. 接下来,a =2会查询(LHS查询)变量a并对其进行赋值。

LHS和RHS查询都会在当前执行作用域中开始,如果有需要(也就是么有找到所需的标识符),就会向上一级作用域继续查找目标标识符,这样每次上升一级作用域,最后抵达全局作用域(顶层),无论找到或没找到都将停止。
不成功的RHS引用会导致抛出ReferenceError异常。不成功的LHS引用会导致自动隐式地创建一个全局变量(非严格模式下),该变量使用LHS引用的目标作为标识符,或者抛出ReferenceError异常(严格模式下)。

其他详解如下:

变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量(如果之前没有声明过),然后在运行时引擎会在作用域中查找该变量,如果能够找到就会对它赋值。

RHS和LHS查找

引擎会通过查找变量a来判断她它是否已声明过,查找过程由作用域进行协助。
引擎会为变量a进行LHS查询,另外一个查找的类型叫RHS。
LHS和RHS的含义为:“赋值操作的左侧或右侧”,并不一定意味着“=赋值操作方的左侧或右侧”,可以理解为“赋值操作的目标是谁(LHS)”以及“谁是赋值操作的源头(RHS)”;

作用域嵌套

遍历嵌套作用域链的规则:引擎从当前的执行作用域开始查找变量,在当前作用域中无法找到某个变量时,引擎就会在外层嵌套的作用域中继续查找,直到找到该变量,或抵达最外层的作用域(也就是全局作用域)为止。

RHS和LHS查找 异常

在变量没有声明(在任何作用域中都无法找到该变量)的情况下,这两种查找的行为是不一样的。

function foo(){
    console.log(a+b);
    b=a;
}
foo(2);

在第一次对b进行RHS查询时是无法找到该变量的,也就是说这是一个未声明的变量,因为在任何相关作用域中都无法找到。
如果RHS查询在所有嵌套的作用域中遍寻不到所需的变量,引擎就会抛出 RefreneceError 异常。值得注意的是:ReferenceError是非常重要的异常类型。
相较之下,当引擎执行LHS查找时,如果在顶层(全局作用域)中也无法找到目标变量,全局作用域中就会创建一个具有该名称的变量,并将其返回给引擎,前提是程序运行在非“严格模式”。
ES5中引入了“非严格模式”。同正常模式,或者说是“宽松/慵懒模式”相比,严格模式在行为上有很多不同。其中一个不同的行为是严格模式禁止自动或隐式地创建全局变量。因此,在严格模式中LHS查询失败时,并不会创建并返回一个全局变量,引擎会同RHS查询失败时类似的ReferenceError异常。

接下来,如果RHS查询找到了一个变量,但是尝试对这个变量进行不合理的操作,比如视图将一个非函数类型的值进行函数调用,或者引用null或undefined类型的值中的属性,那么引擎就会抛出另外一种类型的异常,叫作TypeError 。

ReferenceError同作用域判别失败相关,而TypeError则代表作用域判别成功了,但是对结果的操作是非法或不合理的。

猜你喜欢

转载自blog.csdn.net/leng_nuan/article/details/82261877
今日推荐