一. 浏览器为什么要有事件循环机制?
由于 js 是单线程的脚本语言,在同一时间,只能做同一件事,为了协调事件、用户交互、脚本、UI 渲染和网络处理等行为,防止主线程阻塞,Event Loop 方案应运而生。
二. 为什么 js 是单线程?
js 作为主要运行在浏览器的脚本语言,js 主要用途之一是操作 DOM。
在 js 高程中举过一个例子,如果 js 同时有两个线程,同时对同一个 dom 进行操作,这时浏览器应该听哪个线程的,如何判断优先级?
为了避免这种问题,js 必须是一门单线程语言,并且在未来这个特点也不会改变。
三. 两种任务
宏任务:整体 script
代码,setTimeout
,setInterval
,UI 渲染,I/O 操作
微任务:new Promise().then()
, MutaionObserver
(前端的回溯,会在指定的 DOM 发生变化时被调用)
四. 为什么有微任务,只有宏任务不行吗?
宏任务遵循「先进先出」的原则执行,无法根据优先级执行。
五. 宏任务和微任务的执行顺序
- 先执行宏任务
- 遇到微任务就将其放到微任务队列中
- 遇到宏任务就将其放到宏任务队列中
- 等此次宏任务执行完毕,检查微任务队列,如果有微任务,全部执行完
- 接着在宏任务队列执行下一个宏任务,以此循环