为何JS代码报错后仍会打印setTimeout内容?求原理解析
问题解答
你的疑问核心是没搞清楚JavaScript中定时器的注册时机和事件循环的执行逻辑,拆解代码执行流程就能明白原因:
第一步:执行三个
setTimeout调用
这三行属于同步代码,执行时会把每个回调函数交给浏览器的定时器模块启动计时,同时将回调标记为「待执行的宏任务」加入宏任务队列。这一步不会触发任何报错,所以三个定时器的回调已经被妥善安排好。第二步:执行
console.log(neha)
这里neha是未定义变量,会抛出ReferenceError,导致当前同步代码执行终止。但要注意:这个报错只会打断后续同步代码的执行,不会取消已经注册完成的定时任务。第三步:事件循环处理宏任务
浏览器的定时器模块会在指定时间(1000ms、2000ms、3000ms)到达后,把对应的回调推入宏任务队列。当主线程处理完同步代码的报错后,会持续检查宏任务队列,发现任务就依次执行,所以三个console.log会按时间顺序打印出来。
简单总结:定时器的「注册操作」是同步完成的,报错只是终止了当前同步任务的执行流程,不会影响已经注册好的定时任务,到时间后回调依然会被执行。
内容的提问来源于stack exchange,提问作者Gayatri Rawat
相关产品推荐
相关产品推荐

