执行过程
- 同步代码按顺序放到Call Stack中执行
- 遇到异步任务记录下来,时机到了添加到宏任务队列(Call Queue)
- 如果遇到微任务添加到微任务队列
- 宏任务和微任务是分开存放的(微任务是ES6规定的,宏任务是浏览器规定的)
- 如果Call Stack为空,代码执行完毕,Event Loop开始执行
- Call Stack为空,先尝试DOM渲染,再触发下一次Event Loop
- 轮询查找Event Loop,如果有就添加到Call Stack中
- 重复上述过程
DOM事件和Event Loop
dom事件会放到web api中等待用户主动调用,然后放到Call Queue,再移动到Call Stack中执行
- js是单线程,异步使用回调,基于Event Loop
- DOM事件也是使用回调,事件是非异步的,但也是基础Event Loop实现的
宏任务和微任务
- 宏任务:
setTimeout、setInterval、DOM事件、Ajax - 微任务:
Promise.then、async/await - 微任务比宏任务更早执行
Event Loop和Dom渲染
每次同步代码执行完毕时,都是DOM渲染的时机,如有变化重新渲染,再触发下一次Event Loop
宏任务和微任务区别
- 宏任务在DOM渲染后触发
- 微任务在渲染前触发