携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情 >>
为什么有事件循环机制
因为Javascript是单线程的,同一时间只能做一件事,所以需要一行一行的执行代码,即使前面的代码耗时过长后面也只能等待,HTML5提出Web Worker标准允许JavaScript脚本创建多个线程,将任务分为了同步任务和异步任务,eventloop是javascript的执行机制
什么是事件循环
- Javascript的执行过程为先执行同步任务再执行异步任务,异步任务中先执行微任务在执行宏任务
- 同步任务:在主线程上按照顺序执行的任务
- 异步任务:先不进入主线程,而是进入消息队列(宏任务队列)或者微任务队列中当中的任务
- 宏任务(macro-task):setTimeout,setInterval
- 微任务(micro-task):promise.then,promise.catch,process.nextTick
- 在代码从上到下执行的时候,遇到同步代码直接在主线程上执行,形成一个执行栈,遇到异步代码区分其为宏任务还是微任务并注册回调函数,把结果放在消息队列和微任务队列中,当主线程空闲时,就从异步的任务队列中不断循环读取事件,先看微任务队列中是否有内容,有则执行,没有啧看消息队列中是否有内容,有则执行。

宏任务
- 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