很久之前就看到javascript的宏任务和微任务但是一直都没有详细了解过,今天无聊索性就整理一下吧~
首先明确一点:javascript是单线程语言也就是一条高速公路,所有的多线程都是模拟出来的。
javascript的事件循环机制
同步任务优先执行,执行结束后执行异步任务,然后在执行下一个同步周而复始。
setTimeout
1.仅仅是在所规定的时间后将其任务放入队列,依旧会等待同步任务执行
2.HTML标准定时器内最低是4毫秒,写0也是4,类似字体大小最小为12px
setInterval
1.基本同timout
2.如果fn执行太慢,就会没有延迟时间因为是放入关系,而不是等待执行完。
进入正题(任务)
除了同步异步 我们有更精细的定义
- macro-task(宏任务):包括整体代码script,setTimeout,setInterval
- micro-task(微任务):Promise,process.nextTick
不同类型的任务进入对应的Event Queue
执行顺序为:
1.先执行总体宏任务然后执行发现的微任务
2.按顺序一个一个的执行总宏任务中的宏任务然后再执行其中对应的微任务
**例如:A代表宏任务B代表微任务(格式不清晰可以看右侧的目录,用标题处理)
A1{
A2{
}.B1
A3{
A4 {
A5
}.B2
}
A4
}.B3
其执行顺序为:
A1-B3-A2-B1-A3-A4-B2-A5**
总结
简言之就是JS只有一个主线程,主线程执行完执行栈的任务后去检查异步的任务队列,如果异步事件触发(按照先宏任务再微任务依次触发),则将其加到主线程的执行栈。
同步-宏任务-微任务
常见的宏任务:I/O 、setTimeout、setInterval;
常见的微任务:Promise.then catch finally、process.nextTick