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

会继续跑。
脚本执行中报错(比如 throw new Error() 或语法错误导致的运行时异常),只会终止当前同步代码块的后续执行,不会清空或取消已经进入任务队列的宏任务或微任务。
关键点在于:错误不影响已入队但尚未执行的任务。
- 宏任务(如
setTimeout、setInterval、fetch回调、用户点击事件等)一旦被宿主环境(浏览器/Node)推入宏任务队列,就与当前执行栈解耦。即使后续代码崩溃,这些任务仍按原计划排队等待调度。 - 微任务(如
Promise.then回调)同理:只要 Promise 已 resolve/reject,其回调已入微任务队列,错误发生时若微任务队列尚未清空,它们仍会在本轮循环中执行;若已清空,则已入队的微任务不受影响,只等下一轮调度。
举个例子:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
console.log('start');
setTimeout(() => console.log('timeout'), 0);
throw new Error('boom');
console.log('end'); // 不会执行
输出仍是:
start timeout // 然后抛出错误
因为 setTimeout 回调早已被浏览器放入宏任务队列,错误只中断了 throw 后的同步代码,不干扰事件循环对已有队列的正常推进。
注意两个边界情况:
- 如果错误发生在 宏任务执行过程中(比如某个
setTimeout回调里 throw),那仅中断该回调,不影响其他已排队的宏/微任务; - 如果错误导致整个上下文崩溃(极罕见,如某些全局钩子被破坏),那属于环境级故障,不是标准事件循环行为。
所以,事件循环本身是健壮的——它不因单个任务失败而停摆,也不主动清理队列。这是 JavaScript 异步容错设计的一部分。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










