执行栈和事件队列
js遇到异步代码时不会马上执行,而是会将该异步任务挂起,继续执行执行栈中的同步任务。当异步任务返回结果后,js会将该事件放入到事件队列中。
当执行栈中的所有任务都执行完毕,主线程为空闲状态,主线程会查看事件队列中是否有任务,如果有任务,则取出排在第一个的任务放到执行栈中执行。
js会不断重复主线程从事件队列中拿取任务并执行的这一过程,该过程称为事件循环(Event Loop)
宏任务和微任务
异步任务之间并不相同,其执行优先级也会有区别
异步任务有两类:宏任务和微任务
在一个事件循环中,异步任务返回结果后,该事件会被分配到对应的宏任务队列或微任务队列中去。
当执行栈为空时,主线程会去微任务队列查看是否有微任务存在,如果不存在,主线程会从宏任务队列中取出最前的一个事件放到执行栈中执行,如果存在微任务,则主线程会依次执行微任务队列中的事件,直至微任务队列为空,然后从宏任务中取出最前的一个事件放到执行栈中执行,如此重复
总的来说:当执行栈执行完毕后会立刻先处理微任务队列中的所有微任务,然后再去宏任务队列中取出一个执行。同一次事件循环中,微任务永远在宏任务之前执行
常见的宏任务:
- script(整体代码)
- setTimeout()
- setInterval()
- postMessage
- I/O
- UI交互事件
常见的微任务:
- new Promise().then(回调)