<script>setTimeout(()=>{console.log('1')},1000)setTimeout(()=>{console.log('2')},3000)var start = Date.now();while ( (Date.now() - start) < 10000 ){}console.log('3')</script>
执行如下代码会发现先打印3,再打印1 再打印2。
现象本质还是因为Js是单线程执行的,永远都是先执行主线程的代码,如果遇到ajax请求,setTimeout等回调,此时会继续执行主线程代码,等异步请求的响应成功或者定时器达到时间点后,浏览器会给此线程的任务队列中push一个回调函数,线程在执行完主线程代码后会一直循环时间队列。