一. Eventloop是什么?
javascript中事件任务分为宏任务和微任务,执行顺序是先执行宏任务再执行微任务。
任务分为同步和异步, 同步放入主线程立即执行,异步的进入event Table并注册函数,之后放入到event Queue中,等待同步执行完后执行。宏任务的主线程执行完之后, 执行微任务主线程的中的事件,这样算是完成了一次事件循环。接下来查看宏任务的Event Queue中是否有未执行的任务,有的话,就开始第二轮事件循环。
- 宏任务:整体代码script,setTimeout, setInterval
- 微任务:Promise.then(非new Promise)
console.log('1');
setTimeout(function() {
console.log('2');
new Promise(function(resolve) {
console.log('4');
resolve();
}).then(function() {
console.log('5')
})
})
输出:
1
2
4
5
- 宏任务同步代码
console.log('1')
- setTimeout,加入宏任务Event Queue,没有发现微任务,第一轮事件循环走完
- 第二轮事件循环开始,先执行宏任务,从宏任务Event Queue中独取出setTimeout的回调函数
- 同步代码
console.log('2')
- new Promise,同步执行
console.log('4')
,发现then,加入微任务Event Queue - 宏任务执行完毕,接下来执行微任务执行Promise.then
- 微任务执行完毕,第二轮事件循环走完,没有发现宏任务,事件循环结束