浏览器中的事件循环
事件循环机制
简单来说:进程开始了之后,程序中会有一个任务队列,js程序按顺序地一个个任务执行。但为了避免阻塞,出现了异步任务。遇到异步任务之后,程序不会立即执行。而是把他放到异步任务的队伍中,等同步任务执行完之后再执行异步任务(当异步任务可以执行了,就会被放在同步任务队列中执行)。
JS是单线程运行的,一个线程中,事件循环是唯一的,但是任务队列可以拥有多个。
宏任务与微任务
- 在事件循环中,先执行同步任务,后执行异步任务,在异步任务的执行中类型中又分了2种任务:微任务和宏任务。
宏任务(macro-task)大概包括:
- script(整体代码)
- setTimeout---定时器
- setInterval---计时器
- setImmediate---立即异步执行一个任务
- I/O-----node中的内容
- UI render
微任务(micro-task)大概包括:
- process.nextTick---立即异步执行一个任务
- Promise
- Async/Await
- MutationObserver(html5新特性)-提供了监视对DOM树所做更改的能力
宏任务与微任务的执行规则
- 执行宏任务,然后执行该宏任务产生的所有微任务(包括微任务产生的新的微任务),微任务执行完毕后,再回到宏任务中进行下一轮循环。
为什么要区分微任务和宏任务?
执行更快的任务应该先执行,不必等执行耗时就的先执行完。从更底层来说:
-
微任务是线程之间的切换,速度快。不用进行上下文切换,可以快速的一次性做完所有的微任务。
-
宏任务是进程之间的切换,速度慢,且每次执行需要切换上下文。因此一个事件循环中只执行一个宏任务。
-
微任务执行快,一次性可以执行很多个,在当前宏任务执行后立刻清空微任务可以达到伪同步的效果,这对视图渲染效果起到至关重要的作用。
而往往视图的渲染是在宏任务执行之后的,先执行微任务可以确保在视图渲染之前,数据已经更新。
node中的事件循环
。。。。。。