关于抛出异常

看了mdn对于throw的解释:throw语句用来抛出一个用户自定义的异常。当前函数的执行将被停止(throw之后的语句将不会执行),并且控制将被传递到调用堆栈中的第一个catch块。如果调用者函数中没有catch块,程序将会终止。

如下代码:并不会打印1和2.

function test(){
    throw new Error('lalal');
    console.log(1);
}
test();
console.log(2);

但是下面的代码,为什么可以打印出2呢。不是throw之后的语句将不会执行吗?

setTimeout(function () { throw new Error('test');console.log(1) }, 0)
setTimeout(function () { console.log(2) }, 2000)
阅读 2.8k
4 个回答

代码就像在一条路上走,一个大石头(Throw)下来,走不动了。但这是说的同步代码的情况

setTimeout 是异步代码,每个 setTimeout 就像是新开了一条路,一条路断了不影响另一条

setTimeOut的回调函数会被放进宏任务队列,因此

setTimeout(function () { throw new Error('test');console.log(1) }, 0)
setTimeout(function () { console.log(2) }, 2000)

以上代码中的第一个异步任务中的错误并不会影响下一个异步的执行,更常见的例子是比如多个ajax请求,其中一个请求异常,并不会影响下一个请求的执行

一个是顺序执行,一个是异步操作。
你第一个是一个函数,是顺序执行的,有问题了直接就停了,
第二个是异步操作的,两个异步之前没什么关系,所以。。。。

推荐问题
宣传栏