js是单线程,同步任务和异步任务
不同的任务对应一个回调(事件、setTimeout、回调)定时器模块、事件处理模块、网络请求模块,什么时候放入事件队列,js引擎轮询,勾到主线程去执行。
宏任务:
分类:setTimeout、setInterval、requestAnimationFrame
1.宏任务所处的队列就是宏任务队列
2.第一个宏任务队列只有一个任务,执行主线程的js代码
3.宏任务队列可以有多个
微任务
分类:new Promise().then() 、 process.nextTick
1.微任务所处的队列就是微任务队列
2.只有一个微任务队列
3.上一个宏任务队列执行完毕之后如果有微任务队列就会执行微任务队列中的所有任务
4.当宏任务队列中的任务全部执行完以后会查看是否有先执行微任务队列中的任务,如果有先执行微任务队列中的所有任务,如果没有就查看是否有宏任务队列
console.log('start'); setTimeout (() => { console.log('setTimeout')},0) new Promise( (resolve, reject) => { for(var i = 0; i < 5; i++) { // 主线程上要立即执行的代码 console.log(i) } resolve(); // promise实例对象的状态为成功的状态 }).then(() => { console.log('Promise实例成功回调执行') // 微任务队列 }) console.log('end')
// start
// 0,1,2,3,4
// end
// promise实例执行
// setTimeout
js主线程任务执行的时候,启动了一个宏任务
宏任务队列 第二个宏任务队列 微任务队列
执行主线程上的代码 setTimeout new Promise().then()