深入了解JS|青训营笔记

30 阅读1分钟

事件循环

单线程

讲事件循环之前,我们先来理解下为什么JS不设计成多线程的。

我们做个假设,如果JS是多线程的,因为JS有DOM API可以操作DOM,此时如果有两个线程在操作同一个DOM,线程1删除了这个dom节点,线程2要操作这个dom,就会产生矛盾,到底以哪个线程为主。

为了避免这种情况的出现,JS就被设计成了单线程 。

宏任务与微任务

JS引擎把所有任务分为两类:宏任务、微任务。

宏任务有:

script整体代码

setTimeout、setInterval

I/O

UI渲染

postMessage

MessageChannel

requestAnimationFrame

setImmediate(Node.js 环境)

微任务有:

new Promise.then()

MutaionObserver

process.nextTick(Node.js 环境)

执行规则

文章一开头我们了解到了单线程的弊端,JS是通过事件循环机制(EventLoop)来解决这一弊端的,接下来我们来看下EventLoop的执行规则:

所有代码作为宏任务进入主线程执行栈,开始执行

执行过程中,同步代码会立即执行,宏任务进入宏任务队列,微任务进入微任务队列

当前宏任务执行完成出队,读取微任务队列,有则执行,直至全部执行完毕

执行浏览器ui进程渲染

检查是否有webworker任务,有则执行

本轮宏任务执行完成,回到第2步,继续执行,直至宏任务与微任务队列全部清空