异常
异常处理:JS代码在运行时如果有错误,那么从错误位置开始下面所有的代码不会被执行(不管后面的代码是否正常),也就是说代码运行时出错会有阻断后面程序执行的功能。
但是如果在开发时,不确定某段代码是否有错误。那么这个时候建议用try catch语句将这段代码进行封装,放到try中的内容为不确定是否有问题的代码。如果代码没有问题则正常执行try中的内容。如果try中的内容真的有错误,那么程序在执行到try中的内容时会抛出错误信息,然后继续执行后面的正常的JS代码,打破了阻断程序执行的问题。格式如下:
try {
//可能出现问题的代码段
}catch(e) {
//处理程序
}
try中放置的是可能出现错误的代码,catch中通常放置对错误代码的处理方式,默认可以不处理。
catch小括号里面的e表示代表当前错误的对象,包含两个属性name和message,name表示错误的类型、message表示错误的提示信息。我们可以用这两个属性分会获取错误类型和信息,也可以直接处理e这个对象。
try {
console.log(num);
} catch (e) {
console.log(e.name);
console.log(e.message);
console.log(e);
}
JS代码执行顺序
语法检查、预编译、运行
语法检查
当<script>标签加载完成后,js引擎会对这段代码的语法进行检查,如果有语法错误,那么这一整段代码都不会被执行。try catch在语法检查阶段是不起作用的
<script type="text/javascript">
try{
console.log("script1"
}catch (e) {
}
</script>
<script type="text/javascript">
console.log("script2");
</script>
预编译
- 将当前作用域中的变量和函数添加到变量对象
- 函数声明提升和变量声明提升。函数声明先提升、然后变量声明提升。如果函数名和变量名相同,在没有变量赋值时,变量中装的是函数的地址,如果给变量赋值,那么变量中装的是变量的值,简单说此时的变量已经不是函数了
<script type="text/javascript">
function fn () {
console.log("hello");
}
var fn;
console.log(fn);
</script>
<script type="text/javascript">
function fn () {
console.log("hello");
}
var fn = 1;
console.log(fn);
</script>
运行
- 在执行阶段,如果执行的代码中有运行错误,那么该错误前面的语句会正常执行,但是后面的语句会被阻断执行,所以此时我们try catch解决此问题
- 当执行到函数时,会在该函数的作用域中创建一个活动对象,并将该作用域中的变量、形参添加到该对象上,然后将该作用域中的变量做声明提升,提升到该作用域的顶端。将实参的值赋值该形参,执行函数体功能性语句
- 当此段<script>标签执行完成后,加载下段<script>标签,然后继续上面的操作