错误类型
JavaScript 中,有多种错误类型,每种类型代表了不同种类的运行时错误。
Error
: 所有错误的基类SyntaxError
:语法错误,通常在代码解析阶段就会被捕获。ReferenceError
:引用错误,当试图访问未声明的变量或函数时抛出。例如,在变量未声明时尝试使用该变量。TypeError
类型错误,当对一个值使用不适当的操作或方法时抛出。例如,调用非函数值、对 null 或 undefined 使用对象的方法等。RangeError
:范围错误,当传递给函数参数的值不符合规范时抛出URIError
:URI 错误,当使用全局函数decodeURI()
、decodeURIComponent()
、encodeURI()
或encodeURIComponent()
时传递了无效的参数时抛出。EvalError
:由于eval()
函数执行时出现的错误而抛出。在现代 JavaScript 中,这个错误类型已经不太常见,因为eval()
错误通常被表示为SyntaxError
或TypeError
。
Error
: 通常使用try catch
语句捕获,并抛出异常
try {
throw new Error()
}catch(e) {
console.log(e.message)
} finally {
}
SyntaxError
:语法错误,通常在代码解析阶段就会被捕获。
// 变量名不规范
var 1ab = 1;
// 关键字赋值
new = 5
// 基本的语法错误
var a = 5:
ReferenceError
:引用错误,当试图访问未声明的变量或函数时抛出。例如,在变量未声明时尝试使用该变量。
// 变量或者函数未声明
test()
// 给无法被赋值的对象赋值的时候, 赋值左侧是无效的
var a = 1 = 2;
TypeError
类型错误,当对一个值使用不适当的操作或方法时抛出。
// 调用不存在的方法
123()
var obj = {}
// obj.say, 认为是一个属性,对象的属性被执行了,所以报类型错误
obj.say() // TypeError, obj is not a function
// 实例化原始值
var a = new 'string'
var a = new 123
RangeError
:范围错误,当传递给函数参数的值不符合规范时抛出
var arr = [1, 2, 3]
arr.length = -1
console.log(arr)
// 对象方法参数超出可行范围
var num = new Number(66.66)
// 参数范围在0-100
// console.log(num.toFixed(-1))
URIError
:URI 错误
// URI: 统一资源标识符
// URL: 统一资源定位符, http://www.baidu.com/news#today
// URN: UNIFORM RESOURCE NAME 统一资源名称
// www.baidu.com/news#today, name特性
var url = 'http://www.baidu.com?name=张子枫'
// 地址编码
var newUrl = new encodeURI(url)
console.log(newUrl)
// 地址解码
var originUrl = decodeURI(newUrl)
var str = decodeURI('%dvdssww%') // 报错,URIError
- 由于
eval()
函数执行时出现的错误而抛出
// EvalError: eval函数执行错误: eval不建议使用,使用不规范,不容易调试,存在性能问题 容易引起XSS攻击
var obj = {
name: 'zzf',
age: 22
}
console.log(eval(obj))
console.log(eval('obj'))
严格模式
严格模式:在代码执行时强制执行更严格解析和错误处理的模式。
-
IE9及以下不支持严格模式
-
严格模式下不能使用
with
表达式 -
严格模式下不能使用
caller/callee
-
严格模式下变量必须声明才能使用
-
严格模式下this默认指向undefined
-
严格模式下,函数的参数不能重复
-
在严格模式下,
eval
中的代码会在自己的作用域中运行,不会影响到周围的作用域。
- 使用
use strict
可以开启严格模式,在IE9以下不支持严格模式
"use strict";
function test() {
"use strict";
}
- 严格模式下不能使用
with
表达式(用来改变作用域)
var a = 1;
var obj = {
a: 2
}
function test() {
var a = 3;
// with可以改变作用域
with(test) {
console.log(a)
}
}
test()
- 严格模式下不能使用
caller/callee
function test() {
console.log(arguments)
console.log(arguments.callee) // 指向当前正在执行的函数本身的引用
}
test()
function test1() {
test2()
}
test1()
function test2() {
console.log(test2.caller) // 指向调用当前函数的调用者
}
- 严格模式下变量必须声明才能使用
a = 1; // 非严格模式下不报错
a = 1; // 严格模式下报错
- 严格模式下this默认指向undefined
function test() {
console.log(this)
}
test() // 严格模式下, this指向undefined, 非严格模式下,this指向window
test.call(1) // 非严格模式下,this指向包装类 new Number(1), 严格模式下,this指向1
- 严格模式下,函数的参数不能重复
function test(a,a) {
console.log(a)
}
test(1,2) // 2, 严格模式下报错
var obj = {
a: 1,
a: 2
}
console.log(obj.a) // 严格模式下也是2
- 在严格模式下,
eval
中的代码会在自己的作用域中运行,不会影响到周围的作用域。
eval('var a = 1; console.log(a)') // eval有独立的作用域
consol.log(a) // 严格模式下报错, 非严格模式下输出1