Javascript中的事件循环机制(eventloop)

97 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情 >>

为什么有事件循环机制

因为Javascript是单线程的,同一时间只能做一件事,所以需要一行一行的执行代码,即使前面的代码耗时过长后面也只能等待,HTML5提出Web Worker标准允许JavaScript脚本创建多个线程,将任务分为了同步任务和异步任务,eventloop是javascript的执行机制

什么是事件循环

  • Javascript的执行过程为先执行同步任务再执行异步任务,异步任务中先执行微任务在执行宏任务
    • 同步任务:在主线程上按照顺序执行的任务
    • 异步任务:先不进入主线程,而是进入消息队列(宏任务队列)或者微任务队列中当中的任务
    • 宏任务(macro-task):setTimeout,setInterval
    • 微任务(micro-task):promise.then,promise.catch,process.nextTick
  • 在代码从上到下执行的时候,遇到同步代码直接在主线程上执行,形成一个执行栈,遇到异步代码区分其为宏任务还是微任务并注册回调函数,把结果放在消息队列和微任务队列中,当主线程空闲时,就从异步的任务队列中不断循环读取事件,先看微任务队列中是否有内容,有则执行,没有啧看消息队列中是否有内容,有则执行。

![image-20220815161326546](/Users/suntianyi/Library/Application Support/typora-user-images/image-20220815161326546.png)

宏任务

  • setTimeout定时器:在指定毫秒数后再调用函数或者计算表达式,单位为毫秒,只执行一次
    • 在执行过程中,因为要先执行同步代码,如果同步代码执行时间过长,则会导致setTimeout中的代码在等待到更晚的时候才执行,setTimeout的延迟时间是最小延迟时间
  • setinterval计时器:按照指定的周期来循环调用函数或计算表达式,单位为毫秒,间隔一定时间重复执行,直到 clearInterval() 被调用或浏览器关闭
console.log('1')
setTimeout(()=> {
  console.log('wait 3000ms')
},3000)
console.log('2')  //1 2 wait 3000ms
//即使延迟时间为零,也是在所有同步事件完成后再执行

微任务

  • promise.then
console.log('1');
setTimeout(()=> {
  console.log('2')
},0)

new Promise(function(resolve) {
  console.log('3')
  resolve();
}).then(function() {
  console.log('4')
})
//1 3 4 2
//只有Promise.then里面的才算微任务

ps:b站视频:【2分钟了解 JavaScript Event Loop | 面试必备-哔哩哔哩】 b23.tv/3tGIfiz