错误信息
1、SyntaxError 语法错误
例如变量名以数字开头
关键字赋值
基本语法错误
2、引用错误
变量或者函数未被声明然后直接调用
给无法赋值的数据进行赋值
3、RangeError 范围错误
数组长度为负数的时候
4、TypeError 类型错误
调用不存在的方法
实例化原始值
5、URIError
6、eval() 函数执行错误
自定义错误类型
new Error("代码错误");
// Error: 代码错误
// at <anonymous>:1:1
try…catch…finally…
当try
代码块内发生报错,程序不会停止执行会直接到catch
中继续执行catch
代码块的主要作用就是捕获try
块中的错误然后执行相关的逻辑finally
不管try
有没有报错,也不管catch
中有什么处理逻辑,finally
内都会执行
try {
console.log("正常执行1");
console.log(a);
console.log("正常执行2");
} catch (error) {
console.log(error); // 字符串的报错提示
console.log(error.name); // 错误的类型
console.log(error.message); // 错误的具体的错误内容
console.log("正常执行3");
} finally {
// 不管try有没有错误,不管catch里面有什么操作,finally都会执行
console.log("正常执行4");
}
console.log("正常执行5");
// 正常执行1
// VM9547:7 ReferenceError: a is not defined
// at <anonymous>:3:17
// ReferenceError
// a is not defined
// 正常执行3
// 正常执行4
// 正常执行5
还可以配合throw
来抛出一场信息。
var jsonStr = "";
try {
if (jsonStr === "") {
// 抛出错误信息
throw "JSON字符串为空";
}
console.log("我要执行了!");
var json = JSON.parse(jsonStr);
console.log(json);
} catch (error) {
console.log(error);
var errorTip = {
name: "数据传输失败!",
errorCode: "10010",
};
console.log(errorTip);
}
// JSON字符串为空
// {name: '数据传输失败!', errorCode: '10010'}
当**throw**
直接抛出一个字符串错误的时候,是拿不到**name**
和**message**
属性的。
var jsonStr = "";
try {
if (jsonStr === "") {
throw "JSON字符串为空";
}
} catch (error) {
console.log(error);
console.log(error.name);
console.log(error.message);
}
// JSON字符串为空
// undefind
// undefind
var jsonStr = "";
try {
if (jsonStr === "") {
throw new Error("JSON字符串为空");
}
} catch (error) {
console.log(error);
console.log(error.name);
console.log(error.message);
}
// Error: JSON字符串为空
// at <anonymous>:4:11
// Error
// JSON字符串为空
严格模式
JavaScript
是由ECMAScript
、DOM
和BOM
三部分组成的,「严格模式」指的是ECMAScript5.0
版本后的语法、方法规范。
:::info
ECMAScript
的历史
- 1997年,1.0 版本发布
- 1998年,2.0 版本发布
- 1999年,3.0版本发布
- 2007年,4.0提出草案,但是因为技术太过激进,多数浏览器厂商不同意这个草案
- 2008年,4.0版本中止,部分规范搬到 3.1 版本中,后 3.1 版本直接更名为 5.0 版本发布
- 2009年,5.0版本发布,5.0 版本没有对 3.0 版本进行太大的改动
- 2011年,5.1版本发布
- 2013年,6.0提出草案
- 2015年,6.0版本发布 :::
当时的ECMAScript3.0
版本的语言安全性比较低,且效率一般,另外加上ECMAScript5.0
大火,所以新增「严格模式」。
某些 3.0 语法(包括非 3.0 语法)在正常模式下运行正常,但是在ES5
的严格模式下运行就会报错或者运行不正常。
启动「严格模式」的方式是使用"use strict"
字符串。
// 启用全局严格模式
"use strict";
function test() {
// 函数内启用严格模式
"use strict";
}
举例子🌰 :
正常模式下,a
直接赋值属于window
对象的属性,严格模式下a
会提示未定义。
"use strict";
// Uncaught ReferenceError: a is not defined
a = 1;
正常模式下,函数内部的this
指向window
对象,严格模式下this
对象是undefind
"use strict";
function test(){
console.log(this); // undefined,非严格模式下 this 指向 window
}
test();
正常模式下,console.log(a)
正常输出1
,严格模式下提示a
是未定义。
"use strict";
eval("var a = 1; console.log(a);");
// a is not defined,严格模式下 eval 是有独立的作用域
console.log(a);