错误只终止当前同步代码块,不影响已入队的宏任务和微任务。宏任务如setTimeout回调、微任务如Promise.then一旦入队即与执行栈解耦,仍按计划执行。

会继续跑。
脚本执行中报错(比如 throw new Error() 或语法错误导致的运行时异常),只会终止当前同步代码块的后续执行,不会清空或取消已经进入任务队列的宏任务或微任务。
关键点在于:错误不影响已入队但尚未执行的任务。
- 宏任务(如
setTimeout、setInterval、fetch回调、用户点击事件等)一旦被宿主环境(浏览器/Node)推入宏任务队列,就与当前执行栈解耦。即使后续代码崩溃,这些任务仍按原计划排队等待调度。 - 微任务(如
Promise.then回调)同理:只要 Promise 已 resolve/reject,其回调已入微任务队列,错误发生时若微任务队列尚未清空,它们仍会在本轮循环中执行;若已清空,则已入队的微任务不受影响,只等下一轮调度。
举个例子:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
console.log('start');
setTimeout(() => console.log('timeout'), 0);
throw new Error('boom');
console.log('end'); // 不会执行输出仍是:
start timeout // 然后抛出错误
因为 setTimeout 回调早已被浏览器放入宏任务队列,错误只中断了 throw 后的同步代码,不干扰事件循环对已有队列的正常推进。
注意两个边界情况:
- 如果错误发生在 宏任务执行过程中(比如某个
setTimeout回调里 throw),那仅中断该回调,不影响其他已排队的宏/微任务; - 如果错误导致整个上下文崩溃(极罕见,如某些全局钩子被破坏),那属于环境级故障,不是标准事件循环行为。
所以,事件循环本身是健壮的——它不因单个任务失败而停摆,也不主动清理队列。这是 JavaScript 异步容错设计的一部分。

















