js事件循环
1、js主线程事件处理脚本
当js执行一个脚本时,会先从上到下解析脚本内的代码,如果这个任务是一个同步任务,js引擎会将任务放入执行栈中就地执行,如果这个任务是一个异步任务,js引擎会将这个任务挂起并放入js运行环境去执行,继续向下寻找同步任务。
2、js运行环境处理异步任务
js运行环境会接收脚本传输过来的异步任务并执行,执行完毕后会将事件返回的结果分为两种放入任务队列中,这两种任务就是宏任务与微任务,js运行环境会将它们分别放入宏任务队列与微任务队列中等待js主线程执行。
3、js主线程解析任务队列
当所有同步任务执行完毕后,js将在任务队列中的代码放入执行栈执行,js会优先读取微任务队列中的任务,当微任务队列执行完毕后,js才会读取宏任务队列中的任务。如果在这个宏任务中还有微任务,主线程会将这个任务放入微任务队列中等待执行,当宏任务执行完毕后,主线程会先查询微任务队列中是否还有微任务需要执行,如果有就先执行微任务,开始循环。
小结:如果宏任务队列与微任务队列同时存在任务将会优先执行微任务
同步任务:
- console.log('')
-
new Promise
异步任务:
- setTimeout、setInterval 定时器
- XMLHttpRequest
- async function
微任务:
- process.nextTick
- Promise.then catch finally