你不知道的JavaScript(上卷)1.4  异常_你不知道的JavaScript(上卷)1.4  异常试读-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > 你不知道的JavaScript(上卷) > 1.4  异常

你不知道的JavaScript(上卷)——1.4  异常

为什么区分LHS 和RHS 是一件重要的事情? 因为在变量还没有声明(在任何作用域中都无法找到该变量)的情况下,这两种查询的行为是不一样的。 考虑如下代码: function foo(a) { console.log( a + b ); b = a; } foo( 2 ); 第一次对b 进行RHS 查询时是无法找到该变量的。也就是说,这是一个“未声明”的变量,因为在任何相关的作用域中都无法找到它。 如果RHS 查询在所有嵌套的作用域中遍寻不到所需的变量,引擎就会抛出ReferenceError 异常。值得注意的是,ReferenceError 是非常重要的异常类型。 相较之下,当引擎执行LHS 查询时,如果在顶层(全局作用域)中也无法找到目标变量, 全局作用域中就会创建一个具有该名称的变量,并将其返还给引擎,前提是程序运行在非“严格模式”下。 “不,这个变量之前并不存在,但是我很热心地帮你创建了一个。” ES5 中引入了“严格模式”。同正常模式,或者说宽松/ 懒惰模式相比,严格模式在行为上有很多不同。其中一个不同的行为是严格模式禁止自动或隐式地创建全局变量。因此,在严格模式中LHS 查询失败时,并不会创建并返回一个全局变量,引擎会抛出同RHS 查询失败时类似的ReferenceError 异常。 接下来,如果RHS 查询找到了一个变量,但是你尝试对这个变量的值进行不合理的操作, 比如试图对一个非函数类型的值进行函数调用,或着引用null 或undefined 类型的值中的属性,那么引擎会抛出另外一种类型的异常,叫作TypeError。 ReferenceError 同作用域判别失败相关,而TypeError 则代表作用域判别成功了,但是对结果的操作是非法或不合理的。

展开全文


推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

《你不知道的JavaScript(上卷)》其他试读目录

• 1.1  编译原理
• 1.2  理解作用域
• 1.3  作用域嵌套
• 1.4  异常 [当前]
• 1.5  小结
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  •