关于 js的运行机制

js首先是单线程的,也就是一条路走到黑..从上到下的顺序执行。
为了避免阻塞js提供了异步回调机制,比如settimeout,setInterval,以及新增的Promise。
在js执行过程中,如果是同步任务,就会直接运行,如果是异步任务就会把他们放入等待区(EventTable)中在等待它运行结束,完成后把回调函数放到任务列表中。
任务队列又分为 宏任务队列,微任务队列。
宏任务包含:整体的script代码(第一次的同步代码),settimeout,setInterval
微任务包含:Promise,process.nextTick
脚本开始执行的时候会从宏任务开始,一步步往下走分别把异步任务扔到等待区,等待区完成的任务将各自走回自己该去的地方,宏任务执行结束之后执行微任务,执行完成之后再执行宏任务,依次循环。

        console.log(1); //宏任务 
        setTimeout(() => { //扔到等待区
            console.log(5);  ////完成回到宏任务等待下次执行
        }, 0);
        let i=setInterval(()=>{ //扔到等待区
            console.log(6); //完成回到宏任务等待下次执行
            clearInterval(i);
        },0)
        new Promise(r=>{
            console.log(2); //这个代码块也是宏任务
            setTimeout(() => { //扔到等待区
                console.log(7); //完成回到宏任务等待下次执行
            }, 0);
            r(); //把下面扔到等待区的then任务标志完成让它去微任务
        }).then(()=>{ //扔到等待区
            console.log(4); //到了微任务等着被执行
        })
        console.log(3);//宏任务

值得注意的是 Promise中直接注册的回调函数将直接运行在宏任务。
上面代码的运行结果 是顺序的 1,2,3,4,5,6,7
ssssyoki

参考:https://juejin.im/post/59e85eebf265da430d571f89

猜你喜欢

转载自blog.csdn.net/weixin_42345308/article/details/80525671