js前端面试题3.0

57 阅读2分钟

十、event loop的机制

JavaScript是如何执行的?

自上而下,从左到右一行一行执行

如果有一行报错,后面的代码不执行

先执行同步代码,在执行异步代码(setTimeout、Ajax)

Event Loop过程

同步代码,一行一行放在call Stack中执行

遇到异步,会先"记录"下代码,等待执行时机(setTimeout、Ajax)。时机到了,将之前"记录""的代码放入Callback Queue

当Call Stack为空(同步代码执行完),Event Loop开始工作

Event Loop轮询查找Callback Queue中是否有可执行的代码,如果有将代码移动到Call Stack中执行

Event Loop如果没有找到可以执行的代码,则会继续轮询查找

image.png

    console.log("start");  //最先执行
    setTimeout(()=>{
        console.log("setTimeout"); //最后执行
    },0)
    console.log("end");  //第二个执行

十一、宏任务和微任务的区别

什么是微任务?什么是宏任务?

微任务:Promise、async await

宏任务:setTimeout、setInterVal、Ajax、DOM事件

二者的区别

先执行微任务,后执行宏任务

宏任务、微任务、DOM渲染的关系

1.Call Stack 清空,触发Event Loop

2.执行微任务

3.DOM渲染

4.执行宏任务

完整Event Loop过程

image.png

十二、手写promise加载图片

出题目的

考察Image对象 考察Promise对象 考察async await

知识点

Image对象

new Image()--声明一个Image对象 onload--当图片加载成功时执行 onerror--当图片加载失败时执行 .src--设置图片路径

Promise

作用:解决回调地狱问题

async await

作用:promise的语法糖,可以增加代码的可读性(用同步的思维写代码) 语法:

    (async function(){
        try{
            const oImg=await loadImg("http://robohash.org/1");
            document.body.appendChild(oImg1);
            const oImg=await lodImg("http://robohash.org/2");
            document.body.appendChild(oImg2)
        }catch(msg){
            console.log(msg)
        }
    })()
    //四种promise的写法
    const oImg=new Image()
    oImg.src="https://robohash.org/1";
    oImg.onload=()=>{
        document.body.appendChild(oImg)
    }
    oImg.onerror=function(){
        console.log("error");
    }
        new Promise((resolve,reject)=>{
            const oImg = new Image();
            oImg.src="https://robohash.org/1"
            oImg.onload=()=>{
                resolve(oImg)
            }
            oImg.onerror=()=>{
                reject("图片加载失败")
            }
        }).then((oImg)=>{
            document.body.appendChild(oImg)
        }).catch((erMsg) => {
            console.log(erMsg);
        })
  function loadImg(src) {
    return new Promise((resolve, reject) => {
      const oImg = new Image();
      oImg.src = src;
      oImg.onload = () => {
        resolve(oImg);
      };
      oImg.onerror = () => {
        reject("图片加载失败");
      };
    });
  }
  loadImg("https://robohash.org/1")
    .then((oImg) => {
      document.body.appendChild(oImg);
      return loadImg("http://robohash.org/2")
    })
    .then((oImg)=>{
        document.body.appendChild(oImg)
        return loadImg("http://robohash.org/3")
    })
    .then((oImg)=>{
        document.body.appendChild(oImg)
    })
    .catch((erMsg) => {
      console.log(erMsg);
    });
      function loadImg(src) {
      return new Promise((resolve, reject) => {
        const oImg = new Image();
        oImg.src = src;
        oImg.onload = () => {
          resolve(oImg);
        };
        oImg.onerror = () => {
          reject("图片加载失败");
        };
      });
    }
    (async function () {
      try{
      const oImg = await loadImg("https://robohash.org/1");
      document.body.appendChild(oImg);
      const oImg2 = await loadImg("https://robohash.org/2");
      document.body.appendChild(oImg2);
      } catch(err){
        console.log(err);
      }
    })();