前端搞懂事件循环机制

简介: 【8月更文挑战第3天】前端搞懂事件循环机制

在前端开发中,理解JavaScript的事件循环(Event Loop)机制对于编写高效、可维护的代码至关重要。事件循环是JavaScript异步编程的核心,它允许JavaScript执行代码而不阻塞用户界面。下面,我将详细介绍事件循环机制,并通过代码示例来加深理解。

JavaScript的执行机制

JavaScript是单线程的,这意味着它一次只能执行一个任务。然而,JavaScript通过事件循环机制支持异步操作,如定时器、网络请求和事件处理等。这些异步操作不会阻塞主线程,而是被放入到任务队列中等待执行。

宏任务与微任务

在事件循环中,任务被分为两类:宏任务(macro-task)和微任务(micro-task)。

  • 宏任务:包括整体的script代码、setTimeoutsetInterval、I/O操作、UI渲染等。
  • 微任务:包括PromiseMutationObserverasync/await(await后的表达式是Promise时)。

事件循环的执行过程

  1. 执行同步代码:从脚本开始执行,直到遇到异步操作。
  2. 处理异步操作:将异步操作放入对应的任务队列(宏任务或微任务)。
  3. 执行微任务:当执行栈为空时,检查并执行所有微任务队列中的任务,直到微任务队列为空。
  4. 渲染:如果需要,更新DOM渲染。
  5. 执行宏任务:处理宏任务队列中的任务,回到步骤3。

代码示例

console.log('Script Start');

setTimeout(() => {
   
    console.log('setTimeout');
}, 0);

Promise.resolve().then(() => {
   
    console.log('Promise 1');
}).then(() => {
   
    console.log('Promise 2');
});

console.log('Script End');

// 输出结果
// Script Start
// Script End
// Promise 1
// Promise 2
// setTimeout

// 分析
// 1. 执行同步代码,输出 "Script Start" 和 "Script End"。
// 2. 将 setTimeout 放入宏任务队列。
// 3. 将 Promise.resolve().then() 链放入微任务队列。
// 4. 执行栈为空,开始执行微任务队列,输出 "Promise 1" 和 "Promise 2"。
// 5. 微任务队列为空,执行宏任务队列中的 setTimeout,输出 "setTimeout"。

注意事项

  • 微任务总是在当前宏任务执行完毕后立即执行,且在当前渲染之前。
  • 宏任务之间的间隔可能会因为浏览器解析DOM、执行样式计算、布局和绘制等任务而延迟。
  • 异步编程中,合理使用Promise和async/await可以简化代码,提高可读性,同时利用事件循环机制优化性能。

结论

通过理解JavaScript的事件循环机制,我们可以更好地编写异步代码,避免主线程阻塞,提高应用程序的响应性和性能。上述代码示例展示了事件循环的基本工作原理,并帮助读者深入理解宏任务和微任务的区别及其执行顺序。

目录
相关文章
|
30天前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
127 2
|
30天前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
37 0
|
30天前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
|
30天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
30天前
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。
|
30天前
|
前端开发 算法 测试技术
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
本文对比测试了通义千文、文心一言、智谱和讯飞等多个国产大模型在处理基础计数问题上的表现,特别是通过链式推理(COT)提示的效果。结果显示,GPTo1-mini、文心一言3.5和讯飞4.0Ultra在首轮测试中表现优秀,而其他模型在COT提示后也能显著提升正确率,唯有讯飞4.0-Lite表现不佳。测试强调了COT在提升模型逻辑推理能力中的重要性,并指出免费版本中智谱GLM较为可靠。
前端大模型应用笔记(五):大模型基础能力大比拼-计数篇-通义千文 vs 文心一言 vs 智谱 vs 讯飞vsGPT
|
2月前
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
3月前
|
存储 前端开发 JavaScript
前端语言串讲 | 青训营笔记
前端语言串讲 | 青训营笔记
40 0
|
5月前
|
JSON 前端开发 JavaScript
前端Ajax、Axios和Fetch的用法和区别笔记
前端Ajax、Axios和Fetch的用法和区别笔记
92 2