第31篇:前端事件循环彻底吃透——浏览器执行机制、宏微任务(面试必考核心)
前言
前面我们学完了所有异步用法:定时器、事件、AJAX、Promise、async/await。
但绝大多数新人只会用,不懂为什么这么执行。
面试官最爱问的终极问题:JS 为什么可以单线程处理异步?代码执行顺序到底由谁控制?
答案就是:浏览器事件循环(Event Loop)。
本篇带你零基础吃透前端底层执行原理,搞定宏任务、微任务执行顺序,彻底秒杀前端异步面试题,补齐你的前端底层短板。
一、JS 单线程本质
JavaScript 是单线程语言:同一时间只能做一件事。
如果所有代码同步执行,遇到网络请求、定时器、等待渲染就会卡死页面。
所以浏览器设计者把代码分为两类:
同步代码:立刻执行(循环、判断、变量、函数)
异步代码:先挂起,满足条件后排队执行
管理异步代码排队执行的机制,就是事件循环 Event Loop。
二、两大核心队列:宏任务 & 微任务
1. 微任务(优先级极高)
本轮同步代码执行完优先清空所有微任务
包含:Promise.then/catch/finally、async/await、queueMicrotask
2. 宏任务(优先级低)
微任务全部执行完毕,才会执行宏任务
包含:setTimeout、setInterval、AJAX、DOM事件、script整体代码
三、Event Loop 执行顺序(必背公式)
1. 先执行所有同步代码
2. 清空所有微任务队列
3. 执行一轮宏任务
4. 重复循环
黄金规则:微任务永远优先于宏任务
四、经典面试例题(逐行解析)
console.log("同步1"); setTimeout(() => { console.log("宏任务定时器"); },0) Promise.resolve().then(() => { console.log("微任务Promise"); }) console.log("同步2");
执行顺序解析
1、打印:同步1(同步)
2、定时器放入宏任务队列
3、Promise.then 放入微任务队列
4、打印:同步2(同步执行完)
5、清空微任务 → 打印:微任务Promise
6、执行宏任务 → 打印:宏任务定时器
最终输出顺序:同步1 → 同步2 → 微任务Promise → 宏任务定时器
五、async/await 执行顺序深度解密
记住一句话:await 后面的代码,全部属于微任务
console.log("start") async function fn(){ console.log("async内部同步") await 100 console.log("await之后微任务") } fn() console.log("end")
顺序:start → async内部同步 → end → await之后微任务
六、事件循环在项目中的实际价值
解决定时器不准时问题(定时器最少延迟,不是精准延迟)
解决异步代码顺序混乱BUG
理解为什么 Promise 比 setTimeout 先执行
面试手撕异步输出题完全秒杀
七、本篇结语
事件循环是前端JS底层天花板知识点,是区分小白和入门工程师的分水岭。
学会本篇,你不再是只会写代码的码农,而是懂底层、懂原理、能解释执行机制的前端开发者,面试异步题直接满分。
