学习过程中看到了一篇很不错的博客,加深了我对JS循环机制的理解事件循环机制(Event Loop)的基本认知一、什么是事件循环机制? 为什么是上面的顺序呢? 原因是JS引擎指向代码是 - 掘金
为什么需要事件循环?
JavaScript的单线程语言,这意味着他一次只能执行一个任务,但是浏览器里面进行的事务往往是多线程的。如果没有事件循环机制,当遇到耗时操作时(网络请求、文件读取等等),整个程序会被阻塞,用户界面会被“冻结”,导致极差的用户体验。
而事件循环则通过异步非阻塞的方式解决了这个问题,让单线程的JavaScript也能高效处理并发操作。
如何更好地理解事件循环
可以看下面的这个例子:
————————————————
console.log('1. 开始');
setTimeout(() => {
console.log('6. setTimeout回调');
}, 0);
Promise.resolve().then(() => {
console.log('4. Promise微任务1');
}).then(() => {
console.log('5. Promise微任务2');
});
console.log('2. 中间');
new Promise(resolve => {
console.log('3. Promise构造器');
resolve();
}).then(() => {
console.log('7. Promise微任务3');
});
console.log('8. 结束');
输出结果:
1. 开始
2. 中间
3. Promise构造器
8. 结束
4. Promise微任务1
5. Promise微任务2
7. Promise微任务3
6. setTimeout回调
为什么会是这个结果呢,首先我们可以简单看一下事件循环的流程图
[调用栈] → [微任务队列] → [渲染] → [宏任务队列]
↖_________________________↙
同步代码
立即执行:
不在任何队列中排队
遇到即执行,没有延迟
console.log('开始');
for(let i = 0; i < 1000000000; i++) {} // 同步阻塞
console.log('结束'); // 要等待循环结束才会执行
想象你在餐厅点餐:
同步代码:你直接向厨师点餐(立即执行)
微任务:厨师完成主菜后立即添加的装饰(快速完成的小任务)
宏任务:需要等待的甜点(稍后完成的任务)
事件循环:服务员不断检查是否有新订单或已完成菜品可以上桌
厨师(JS引擎)会优先处理即时订单(同步代码),然后快速完成小装饰(微任务),最后处理需要等待的甜点(宏任务),然后又开始新一轮检查。
JS与现实世界类比
服务员(事件循环)只有一个,但需要服务多桌客人
同步点餐:立即处理的简单请求(如倒水)
微任务:快速完成的小请求(如拿餐具)
宏任务:耗时的请求(如烹饪主菜)
https://blog.csdn.net/MrsBaek/article/details/147239053