JavaScript 事件循环
JavaScript 事件循环
唠唠基础😊
众所周知 js 是单线程的,至于为什么是单线程的?
答: js作为脚本语言,其主要负责 操作DOM 和 用户交互 。假如变成多线程的话,一个线程在给某个DOM 添加内容 ,而另外一个线程正在删除这个 DOM 一切就乱套了。
01 同步任务和异步任务
虽然 js 是单线程,但是引入两个概念,一个是同步,另外一个异步。
- 同步任务:
代码是按照执行栈顺序执行下来的,比如:
1 | |
- 异步任务:
异步操作,比如:setTimeout,Promise,Ajax…等。当顺序执行 执行栈 代码时,遇到异步操作,可以把它们看做比较耗时的工作,放入任务队列中去,接着执行代码,等执行完同步代码后在执行任务队列 的任务。
1 | |
可以很清晰看到先打印 DouR
02 Event Loop
事件循环就是 入栈出栈 的过程,上面提到的异步任务,可以分成 宏任务(Macrotask) 和 微任务(Microtask)
宏任务:setTimeout, setInterval, setImmediate, I/O, UI render
微任务:process.nextTick, Promises, Object.observe, MutationObserver(H5 新特性)
每一次 Event Loop 触发时:
- 首先执行
主执行栈任务,例如 script 任务 - 分别将
宏任务和微任务,压入宏任务队列和微任务队列 - 接着,先取出
微任务队列执行直至清空(执行过程中,碰到微任务或者宏任务分别压入队列中去,用于下一轮 Event loop执行) - —— 新的一轮 Event Loop——
- 取出
宏任务队列执行直至清空 - 取出
微任务队列执行直至清空 - 5、6重复
试试这个栗子:
1 | |
结果:

说个冷知识,浏览器的事件循环 和 Node事件循环不一致浏览器和Node不同的事件循环(Event Loop) - 掘金 (juejin.cn)
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!