在变量还没有声明, LHS,RHS 两种查询的行为是不一样的

 

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

 

第一次对 b 进行 RHS 查询时是无法找打该变量对,如果 RHS 查询在所有嵌套的作用域中遍寻不到所需的变量,引擎就会抛出 ReferenceError 异常

 

当引擎执行 LHS 查询时,如果在全局作用域中也无法找到目标变量,全局作用域中就会创建一个具有该名称的变量

 

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

 

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