先拓展几个知识点:
进程:计算机已经运行的程序,是操作系统管理程序的一种方式
线程:操作系统能够运行运算调度的最小单位,通常情况下它被包含在进程中
javascript是单线程的(同一时刻只能做一件事,可能被阻塞),但是js的线程应该是有自己的容器进程的:浏览器或者node
多数浏览器是多进程的,一个Tab标签页是一个进程,为了防止一个页面卡死,导致要退出整个浏览器。每个进程又包括很多个线程,其中就包括js线程
事件循环
真正耗时的操作并不是由js线程执行的,js线程将异步操作交由浏览器的其他线程计时执行,执行完后回调放进浏览器维护的事件队列里,最后再由js线程依次取出执行的一个过程称为事件循环
微任务和宏任务
事件队列又分为微任务队列和宏任务队列,宏任务队列执行之前会先确定微任务队列已经执行空了,才会执行,若是微任务队列不为空,则会执行完微任务再执行宏任务
// 打印顺序为2-1-3
setTimeout(()=>{
console.log("我是宏任务1");
},0)
queueMicrotask(()=>{
console.log("我是微任务");
})
setTimeout(()=>{
console.log("我是宏任务2");
},0)