
执行顺序分析
- 立即执行的异步函数,且函数体内没有await,可以认为是一个普通的同步函数
- 此时a函数中形参num=0,输出 1-0,然后进入b函数
- b函数是一个异步函数,函数体内有await
- 此时b函数中形参num=0,++写在后面,先计算再自增,输出 3-0
- await函数同步执行,进入c函数
- 此时c函数中形参num=0,++写在后面,先计算再自增,输出 5-0
- setTimeout()注册宏任务,往下执行,++写在前面,先自增后计算,输出 7-1,c函数运行结束
- c函数运行结束,回到b函数中,await后面的函数为回调函数,微任务1注册后,回到a函数
- a函数中,往下执行,输出 5-1,因为num在c函数中已经自增了,a函数运行完成
- 进入promise函数,promise函数体内是同步执行,then后为执行成功后的回调函数
- 输出 8-0,因为之前的是形参num,对n没有影响,注册then后面的微任务2
- 输出 10-false,因为++写在后面,先计算再自增,返回false
- 输出 8-1,因为n计算后进行了自增
- 主线程结束,现在有两个微任务2和一个等宏任务待执行,此时num=1,n=1
- 执行微任务2,输出 4-2,此时num=2,因为++写在前面,num=1再进行一次自增
- 执行微任务2,输出 9-1,此时n=1,因为++写在后面
- 微任务执行完成,执行下一个宏任务
- 输出 6-1,这里比较难理解,这里的num是存在c函数作用域中num,num作为形参传入函数,此时num=0,先执行 5-0,再执行7-1,最后执行setTimeout()传入的num=1