今天碰到一个很经典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在最后被执行