1. setTimeout(function(){
    2. console.log(1);
    3. },0)
    4. new Promise(function execulor(resolve){
    5. console.log(2)
    6. for(var i = 0i<10000;i+=1){
    7. i ==9999 && resolve()
    8. }
    9. console.log(3)
    10. }).then(function(){
    11. console.log(4)
    12. })
    13. console.log(5)

    以上代码的执行结果为
    2 3 5 4 1

    event loop 事件循环 执行队列

    javascript 是单线程的 线程中的任务分为 同步任务和异步任务 异步任务分为宏队列任务(setTimeout ,setIntervar 和 IO) 和 微队列任务(**Promise、MutaionObserve等**)

    javascript 执行顺序如下
    1、首先执行完所有的同步任务
    2、执行完后清空调用栈
    3、**将位于微队列队首的任务拿出来放到执行栈中
    4、继续执行微队列中的任务 直到执行完毕 (若中途新加入微队列任务 则放到对末尾执行)
    5、执行完后调用栈内容清空 微队列任务也为空
    6、取出宏队列队首任务执行
    7、执行完毕 调用栈为空
    7、重复执行3-7**

    依次可以得出上面的执行顺序

    对于async/await async 和 awiat 相当于Promise
    执行完 await 相当于 执行完resolve

    1. async function fn1(){
    2. console.log(1)
    3. await fn2();
    4. console.log(2)
    5. }
    6. //相当于
    7. new Promise(function(resolve){
    8. console.log(1)
    9. fn2()
    10. resolve()
    11. }).then(function(){
    12. console.log(2)
    13. })

    示例:

    1. async function fn1(){
    2. console.log(1)
    3. await fn2();
    4. console.log(2)
    5. }
    6. function fn2(){
    7. console.log(3)
    8. }
    9. console.log(4)
    10. setTimeout(() => {
    11. console.log(5)
    12. }, 0);
    13. fn1();
    14. new Promise(function(resolve){
    15. console.log(6)
    16. resolve();
    17. }).then(function(){
    18. console.log(7)
    19. })
    20. console.log(8)

    输出结果: // 4 1 3 6 8 2 7 5