前言
通过三个由浅入深的实例,帮助你彻底掌握JavaScript事件循环机制。每个实例都包含代码分析、执行顺序预测、详细解析和知识点总结,是面试备考和技术提升的绝佳材料。
[前面的meta信息和前言部分保持不变…]
案例一:基础事件循环示例
实例解析
- 同步代码执行阶段:
// 主线程首先执行同步代码
console.log('同步任务 1'); // 立即输出
// 注册宏任务1(setTimeout),加入宏任务队列
// 注册Promise的then回调,加入微任务队列
console.log('同步任务 2'); // 立即输出
- 微任务队列清空阶段:
// 执行Promise.then的第一个回调
console.log('微任务 2');
// 注册新的setTimeout(宏任务3)
// 执行第二个then回调
console.log('微任务 3');
- 宏任务队列执行阶段:
// 执行第一个setTimeout回调
console.log('宏任务 1');
// 注册新的Promise.then(微任务1)
// 注册新的setTimeout(宏任务2)
- 新的微任务队列清空:
console.log('微任务 1');
- 继续执行宏任务队列:
console.log('宏任务 2');
console.log('宏任务 3');
难点分析
- 嵌套任务处理:
- 宏任务中可以产生新的微任务
- 微任务优先级始终高于宏任务
- 每个宏任务执行后都会检查微任务队列
- 事件循环的分层机制:
- 同步代码 → 微任务队列 → 宏任务队列
- 循环往复,直到所有队列清空
案例二:复杂Promise链
实例解析
- 初始同步代码执行:
console.log('同步任务 1');
// 注册第一个setTimeout(宏任务1)
// 注册Promise链(微任务4和5)
console.log('同步任务 2');
- 初始微任务队列处理:
console.log('微任务 4');
// 注册新的setTimeout(宏任务3)
console.log('微任务 5');
- 宏任务1执行及其微任务:
console.log('宏任务 1');
// 注册Promise链(微任务1和2)
console.log('微任务 1');
console.log('微任务 2');
- 后续宏任务处理:
console.log('宏任务 2');
console.log('微任务 3');
console.log('宏任务 3');
执行特点分析
- Promise链式调用:
- then回调返回新Promise
- 微任务按注册顺序执行
- 动态创建的微任务立即加入队列
- 任务优先级处理:
- 同步代码最高优先级
- 微任务队列次优先级
- 宏任务队列最后执行
案例三:Promise异常处理链
实例解析
- 主线程同步代码:
console.log('同步任务 1');
// 注册三个初始任务:
// 1. setTimeout(宏任务1)
// 2. Promise.reject链
// 3. setTimeout(宏任务3)
console.log('同步任务 2');
- Promise.reject处理流程:
// reject直接触发catch
console.log('微任务 5');
// catch返回resolve,触发then
console.log('微任务 6');
- 宏任务1及其Promise链:
console.log('宏任务 1');
// Promise链式调用:
console.log('微任务 1'); // reject触发
console.log('微任务 2'); // catch处理
console.log('微任务 3'); // 最终then
- 最终宏任务处理:
console.log('宏任务 3');
console.log('宏任务 2');
难点要点总结
- Promise错误处理机制:
- reject会跳过then直接到catch
- catch后返回resolve可继续then
- 完整的Promise链式调用
- 事件循环中的异常处理:
- 异常不影响事件循环继续
- 保持错误处理的连续性
- 维持任务队列的执行顺序
综合实践建议
1. 调试技巧
// 添加调试标记
console.log('==== 开始执行宏任务 ====');
setTimeout(() => {
console.log('==== 进入宏任务1 ====');
// 任务代码
console.log('==== 宏任务1结束 ====');
}, 0);
2. 实践练习方向
- 修改Promise状态:
- 将resolve改为reject
- 观察catch的处理流程
- 分析then链的变化
- 调整任务嵌套:
- 增加Promise嵌套层级
- 混合async/await语法
- 观察执行顺序变化
- 性能优化实践:
- 控制微任务数量
- 避免过深的任务嵌套
- 合理安排任务优先级
面试技巧
- 答题思路:
- 先说明事件循环基本原理
- 分析代码执行步骤
- 解释关键输出结果
- 总结实践经验
- 重点关注:
- Promise链式调用原理
- 微任务宏任务优先级
- 异常处理机制
- 实际应用场景
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。