前端面试题:事件循环(Eventloop)

什么是事件循环?如何理解事件循环?事件循环原理如何描述?事件循环涉及了很多知识点,想要彻底掌握JS事件循环原理必须要掌握以下知识点:同步任务、异步任务、宏任务、微任务、任务队列、执行栈、js运行机制、EventLoop。

1.事件循环概念

事件循环就是js编译器解析与执行代码的规则。js本身是单线程,即同一时刻只能干一件事,而js任务包含了同步任务和异步任务,浏览器会率先执行同步代码,将异步代码放入消息队列(任务队列)中,待主线程任务完成后执行,而异步代码又分为宏任务和微任务,在同步代码全部执行完成后会先执行异步微任务再执行异步宏任务,如果异步任务中仍有异步任务,会继续放入消息队列(任务队列),以此类推,便形成了一个事件循环。(另外还需要分清楚事件循环是问的浏览器还是node的,两者不一样哦~此文)

2.宏任务和微任务

  • 宏任务(macro task): 宏任务是由宿主环境(浏览器、Node)发起的,常见宏任务如下
    setTimeout()
    setInterval()
    setImmediate()(Node.js 环境)
    script( 整体代码)
    I/O
    UI 交互事件
    特点:
    (1) 不唯一,存在一定的优先级(用户I/O部分优先级更高)
    (2) 异步执行,同一事件循环中,只执行一个

  • 微任务(micro task): 微任务是由JS发起的任务,常见微任务如下:
    promise.then()
    promise.catch()
    new MutaionObserver()
    object.observe
    Async/Await
    process.nextTick()(Node.js 环境)
    注:promise本身同步,then/catch的回调函数是异步的
    特点:
    (1) 唯一,整个事件循环当中,仅存在一个;
    (2) 执行为同步,同一个事件循环中的microtask会按队列顺序,串行执行完毕;

3.小试牛刀

网上找个例子,一起练练手吧~

  • 1
console.log('同步代码1');
setTimeout(() => {
    console.log('setTimeout')
}, 0)
new Promise((resolve) => {
  console.log('同步代码2')
  resolve()
}).then(() => {
    console.log('promise.then')
})
console.log('同步代码3');
// 最终输出"同步代码1"、"同步代码2"、"同步代码3"、"promise.then"、"setTimeout"
  • 2
  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();
  }).then(function() { 
      console.log('promise2');
  });
  
  console.log('script end');
  //答案:script start async1 start async2 promise1 script end async1 end promise2 setTimeout

注释:因为是前端面试题,所以答案是以浏览器的eventloop机制为准的,在node平台上运行会有差异!!!!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我会尽力回答您的问题。前端事件循环机制是指在浏览器中,所有的 JavaScript 代码都是通过事件循环来执行的。事件循环是一种机制,用于协调 JavaScript 代码的执行顺序,以确保所有的代码都能够按照正确的顺序执行。下面是一个简单的前端事件循环机制面试题: 1. 请简述前端事件循环机制的执行流程。 答:前端事件循环机制的执行流程主要包括以下几个步骤: 1)收集任务:将所有需要执行的任务加入到任务队列中。 2)执行任务:根据任务队列中的任务类型,将其分为宏任务和微任务。 3)执行宏任务:从宏任务队列中获取一个宏任务进行执行。 4)执行微任务:在宏任务执行期间,如果产生了微任务,将其加入到微任务队列中。 5)清空微任务:在宏任务执行结束后,清空微任务队列中的所有任务。 6)重复执行:重复执行步骤 3~5,直到任务队列中没有任务可以执行。 2. 请简述宏任务和微任务的区别。 答:宏任务和微任务是前端事件循环机制中的两种任务类型。宏任务是指一些较为耗时的任务,比如 setTimeout、setInterval、ajax 请求等。而微任务是指一些较为简单、执行时间较短的任务,比如 Promise.then、MutationObserver 等。 宏任务和微任务的执行顺序有所不同,具体来说,宏任务会在本轮事件循环的末尾执行,而微任务会在本轮事件循环的末尾执行完所有的宏任务后立即执行。这也就是为什么在 Promise.then 中产生的微任务会先于 setTimeout 中的宏任务执行的原因。 希望我的回答能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值