前言
JavaScript中定义了七种错误类型:
Error
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError
具体可参考MDN,ReferenceError
和 TypeError
为开发中常遇见的类型,这里我做一下区分
RHS和LHS
当我们执行a = 2
这段代码的时候,引擎会为变量 a
执行LHS查询。与之相对应的为RHS查询,简单的理解就是赋值操作的左侧查询和右侧查询,更准确的说RHS为找到某个变量的值,LHS则是找到变量的容器,RHS可以说是“非左侧”。
console.log(a);
b();
这里的 a
和 b
就是RHS查询
ReferenceError
当对一个变量进行RHS查询没在作用域中找不到所需变量时候,就会抛出ReferenceError,如上面的例子中,若a没有定义,就会抛出错误
console.log(a) // Uncaught ReferenceError: a is not defined
与RHS不一样,若LHS时候变量未定义,会在全局作用域中创建该变量,前提是运行在非严格模式下
a = 2;
consol.log(window.a);
TypeError
如果RHS查询到变量,但是你尝试对这个变量进行不合理的操作,例如调用一个非函数类型,查询 null
和 undefined
类型值的某个属性,引擎就会抛出 TypeError
var a = 1
a() // Uncaught TypeError: a is not a function
console.log(a.info.name); // Uncaught TypeError: Cannot read property 'name' of undefined
隐藏的操作
在函数调用时候我们,传入参数其实隐藏了一个LHS和RHS
function foo(a) {}
foo(b)
foo
在调用时实际上相当于在函数 foo
中执行了一次var a = b
,这里包含了一个RHS和LHS,若b没有定义的话就会抛出ReferenceError
参考
《你不知道的JavaScript》(上卷)