开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情
区分RHS和LHS很重要
为什么说区分RHS和LHS很重要呢?
因为变量还没声明的情况下,两者的查询行为是不一样的。
考虑如下代码:
function foo (a) {
console.log(a + b)
b = a
}
foo(1)
在console.log中变量b进行RHS查询无论是foo函数作用域还是全局作用域中,都是找不到的,会抛出错误类型ReferenceError类型。
而下面一行代码b = a对变量b进行LHS查询,在非严格模式下是不会报错的,不仅不会报错,而且全局作用域还有热心的创建一个变量b返回给引擎。当然,如果是在严格模式下,也是会报错的,不会凭空创建这个变量,那报错类型也是ReferenceError。
ReferenceError
从上面可以看出,当被操作的变量不存在时,则会抛出ReferenceError类型错误,这是个非常重要的错误类型,也是最常见错误类型之一。
TypeError
当你对某个变量的值进行不合理操作的时候,例如:
let a
console.log(a.b) // Uncaught TypeError: Cannot read properties of undefined (reading 'b')
这时候抛出的错误类型是TypeError,因为要让a.b正常输出,变量a得是个对象,而在整个作用域中,变量a是undefined,仅声明并未进行任何赋值操作。这也是一种非常重要且常见的错误类型。
在实际开发过程中,我们要非常重视这类报错,因为它们会阻断后面程序的运行,如果某个页面的是否显示控制变量在这两类错误之后执行,当出现报错时,整个页面都可能显示不出来了。
除了这两类常见的错误类型,还介绍一种SyntaxError。
SyntaxError
当JavaScript引擎解析编译器编译好的代码时,遇到了不符合语法规范的标记(token)或标记顺序时,就会报语法错误。
我们知道,在JavaScript中,命名变量只能是数字、字母或下划线,并且数字不能放在首位,这就是语法规范,如果我们将数字放在首位作为变量名,那就会报SyntaxError语法错误。
console.log(1abc) // Uncaught SyntaxError: Invalid or unexpected token