【前端面试题】事件循环event_loop

JavaScript是一个单线程语言。

任务分为同步任务和异步任务。

同步任务就是立即执行的任务,同步任务会进入主线程立即执行,当浏览器遇到异步任务时,会将异步任务扔到异步队列中去,等同步任务执行完毕后,再按照“微先宏后”的执行顺序依次执行异步任务。

“微先宏后”就是在异步任务队列中微任务先执行,宏任务后执行。

微任务包括:promise

宏任务包括:setTimeout、setInterval、UI交互、IO、script整体代码

下面来看面试题,先看题目,思考后有自己的想法再看题目结果,有不懂的再看解析。

目录

第一题

原题

结果

解析

第二题

原题

结果

解析

第三题

原题

结果

解析


第一题

原题

        var promise=new Promise((resolve)=>{
            console.log("promise start...");
            resolve("promise");
        })
        promise.then((val) => {
            console.log(val);
        })
        setTimeout(()=>{
            console.log("settimeout");
        })
        console.log("test end...");

结果

解析

        //第一题
        var promise=new Promise((resolve)=>{
            console.log("promise start...");
            resolve("promise");
        })
        promise.then((val) => {
            console.log(val);
        })
        setTimeout(()=>{
            console.log("settimeout");
        })
        console.log("test end...");
        //先执行promise内部的代码,遇到异步任务将异步任务扔到异步队列里,先处理同步任务;
        //异步任务有:then setTimeout 异步任务队列中先执行微任务,再执行宏任务
        //执行顺序: promise start...->test end...->promise->settimeout
        

第二题

原题

        //第二题
        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();
            console.log("promise3");
        }).then(function(){
            console.log("promise2");
        })
        console.log("script end");

结果

解析

        //第二题
        async function async1(){
            console.log("async1 start");
            await async2();
            //await后面是个异步方法
            console.log("async1 end");//异步1
        }
        async function async2(){
            console.log("async2");
        }
        //函数定义的时候不执行,但是在函数调用的时候函数体内部的代码才会执行。
        console.log("script start");
        //定时函数
        setTimeout(function(){
            console.log("settimeout");//异步3
        },0)//宏任务后执行
        async1();
        new Promise(function(resolve){
            console.log("promise1");
            resolve();
            console.log("promise3");
        }).then(function(){
            console.log("promise2");//异步2
        })
        console.log("script end");
        //async 可以单独使用 但是await要和async搭配使用 async和await是一对多的关系,即一个async可以有多个await
        //async和await是promise的语法糖,比promise语法更简洁更好用。

第三题

原题

        //第三题
        var promise=new Promise(resolve=>{
            console.log(1);
            resolve()
        })
        setTimeout(()=>{
            console.log(2);
        })
        promise.then(()=>{
            console.log(3);
        })
        var promise2=getPromise();
        async function getPromise(){
            console.log(5);
            await promise;
            console.log(6);
        }
        console.log(8);

结果

解析

        //第三题
        var promise=new Promise(resolve=>{
            console.log(1);
            resolve()//异步
        })
        setTimeout(()=>{
            console.log(2);//异步 最后一个setTimeout
        })
        promise.then(()=>{
            console.log(3);
        })
        var promise2=getPromise();
        async function getPromise(){
            console.log(5);
            await promise;//await 一个promise对象  异步 promise.then
            console.log(6);
        }
        console.log(8);

欢迎点赞、关注、收藏~

猜你喜欢

转载自blog.csdn.net/weixin_45906196/article/details/121325796