什么是宏任务和微任务
我们都知道JS是单线程,但是一些高耗时的操作会带来进程阻塞问题,为了解决这个问题,js有两种任务的执行模式:同步模式和异步模式。
在异步模式下,创建异步任务主要分为宏任务(macro task)和微任务(micro task)两种。常见的宏任务有setTimeout、setInterval、script、I/O操作、UI渲染,常见的微任务有promise、MutationObserver,宏任务是由宿主(浏览器、Node)发起的,而微任务由JS自身发起的。宏任务包含微任务,整个script标签就是一个宏任务。
宏任务和微任务执行顺序
执行某个宏任务时,首先执行同步任务,然后执行微任务队列中的所有任务,再读取宏任务队列中排在最前的任务,执行这个宏任务时,首先执行同步任务...
function app() {
setTimeout(() => {
console.log("1-1");
Promise.resolve().then(() => {
console.log("2-1");
});
});
console.log("1-2");
Promise.resolve().then(() => {
console.log("1-3");
setTimeout(() => {
console.log("3-1");
});
});
}
app();
输入结果
1-2 1-3. 1-1. 2-1. 3-1
从上面代码中我们可以看到首先执行同步任务,打印出1-2,然后创建一个微任务队列,一个宏任务队列,先执行微任务队列,打印出1-3,里面有一个宏任务会排在第一个宏任务后面,执行第一个宏任务,打印出1-1,然后执行里面的微任务,打印出2-1,最后执行后一个宏任务打印出3-1。
Event-Loop
- JS分为同步任务和异步任务
- 同步任务都在主线程上执行,形成一个执行栈
- 主线程之外,还会设立一个任务队列,用于存放异步任务,每当有异步任务有了运行结果,就会在任务队列之中放置一个事件。
- 当执行栈的任务执行完成之后,就会去任务队列中看有没有事件,有的话就放到执行栈中执行。
这个过程会不断重复,这种机制就被称为事件循环(Event Loop)机制。