JS的执行顺序 setTimeout与Promise async/await

今天碰到一个很经典js执行顺序的题 代码不是很长
问的是console.log的输出顺序
这道题涉及到的知识点还挺多的
async function async1() {
    console.log("async1start");
    await async2();
    console.log("async1end");
}
//函数2
async function async2() {
    console.log('async2')
}
console.log("scriptstart");
setTimeout(function () {
    console.log("settimeout");
}, 0)

async1()
new Promise(function (resolve) {
    console.log("promise1");
    resolve();
}).then(function () {
    console.log("promise2");
});
console.log('script end');
  
  //执行结果
   scriptstart
   async1start
   async2
   promise1
   script end
   async1end
   promise2
   settimeout
js 单线程的 它会先执行一些同步操作 所以先输出的就是scriptstart
然后是async1start async声明的函数虽然执行异步 但是他也是属于同步的写法
和async同时出现的await 会强迫其他代码等待自己执行完之后再执行 所以第三个输出async2
然后再继续 输出 promise1和script end
async1end最后一个同步代码输出完毕
剩下的就是promise的.then里边的异步 和 settimeout 这里涉及到异步的宏任务和微任务 settimeout 属于宏任务,promise属于微任务
主线程执行完了之后先从微任务栈里面获取微任务执行,没有微任务了,就去宏任务栈里面获取宏任务执行,所以在一个循环内,微任务是比宏任务先执行的
所以setTimeout在最后被执行
原文地址:https://www.cnblogs.com/mxnl/p/13507057.html