azl397985856 / fe-interview

宇宙最强的前端面试指南 (https://lucifer.ren/fe-interview)
Apache License 2.0
2.85k stars 260 forks source link

【每日一题】- 2019-08-19 - 以下代码的输出结果是什么? #17

Closed azl397985856 closed 5 years ago

azl397985856 commented 5 years ago
async function async1() {
    console.log('async1 start');
    await async2();
    console.log('async1 end');
}
async function async2() {
    console.log('async2');
}
console.log('script start');
setTimeout(function() {
    console.log('setTimeout');
}, 0)
async1();
new Promise(function(resolve) {
    console.log('promise1');
    resolve();
}).then(function() {
    console.log('promise2');
});
console.log('script end');
HEternally commented 5 years ago

script start async1 start async2 promise1 script end async1 end promise2 setTimeout

aatoe commented 5 years ago

宏任务:I/O , setTimeout, setInterval, 当前script ...这些是常用的   微任务:Promise.then catch finally,async

首先我们明白,一旦执行栈中的所有同步任务执行完毕(此时JS引擎空闲),系统就会读取任务队列,将可运行的异步任务添加到可执行栈中,那么回到题目中来,一开始运行js代码的时候就是一个宏任务,然后一行一行往下面执行,遇到其他异步的宏任务放到宏任务队列里面,然后等当前宏任务完全结束才运行,注意是完全结束,然后遇到微任务会把任务放到微任务队列里面,当同步代码运行完马上运行微任务队列里面的任务.接着开始下一个宏任务,如此循环下去.这是eventLoop. 下图是我的详细解释。 注意缩进和序号。

异步