在上一篇博客https://blog.csdn.net/qq_37216615/article/details/80891480 中介绍了什么是LHS和RHS,你可能会疑惑知道他两有什么用呢?
结合对LHS和RHS的理解,考虑如下代码:
function(a){
console.log(a+b);
b=a;
}
foo(2);
在执行log(a+b)时,引擎会对a和b分别做一次RHS查询,作用域找得到a但是找不到b,因为编译器没有进行b的声明,所以说引擎也获取不到b的值,于是引擎就会抛出异常:ReferenceError。
下面来看LHS查询:当引擎做LHS查询时,如果在全局作用域中也无法找到变量,全局作用域就会创建一个具有该名称的变量,并交给引擎,但前提是程序运行在宽松模式下。也就是说这个变量之前并不存在,但是作用域热心的为引擎创建了一个,所以说LHS查询其实是失败的,只不过全局作用域帮着解决了。
但是在严格模式下是禁止自动或隐式的创建全局变量的,因此严格模式下LHS查询失败时,全局作用域也没辙,引擎只能抛出异常
function f(){
'use strict';
a = 5;
}
f() //ReferenceError:a is not defined
接下来看另外一种情况:如果RHS查询到了一个变量,但是你对这个变量进行了不合理的操作,比如对一个非函数类型进行函数调用,那么就会抛出另外一个异常TypeError
总结:作用域判别失败导致ReferenceError,作用于判别成功但是操作非法会导致TypeError