Javascript中 TypeError 和 ReferenceError

1,936 阅读1分钟

前言

JavaScript中定义了七种错误类型:

  • Error
  • EvalError
  • RangeError
  • ReferenceError
  • SyntaxError
  • TypeError
  • URIError

具体可参考MDNReferenceErrorTypeError为开发中常遇见的类型,这里我做一下区分

RHS和LHS

当我们执行a = 2这段代码的时候,引擎会为变量 a 执行LHS查询。与之相对应的为RHS查询,简单的理解就是赋值操作的左侧查询和右侧查询,更准确的说RHS为找到某个变量的值,LHS则是找到变量的容器,RHS可以说是“非左侧”。

console.log(a);
b();

这里的 ab 就是RHS查询

ReferenceError

当对一个变量进行RHS查询没在作用域中找不到所需变量时候,就会抛出ReferenceError,如上面的例子中,若a没有定义,就会抛出错误

console.log(a) // Uncaught ReferenceError: a is not defined

与RHS不一样,若LHS时候变量未定义,会在全局作用域中创建该变量,前提是运行在非严格模式下

a = 2;
consol.log(window.a);

TypeError

如果RHS查询到变量,但是你尝试对这个变量进行不合理的操作,例如调用一个非函数类型,查询 nullundefined 类型值的某个属性,引擎就会抛出 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》(上卷)