详细介绍:JavaScript学习笔记(十七):ES6生成器函数详解

news/2025/10/25 11:29:24/文章来源:https://www.cnblogs.com/wzzkaifa/p/19165060

ES6生成器函数详解

ES6引入的生成器函数(Generator Function)是一种特殊的函数,允许通过yield关键字暂停和恢复执行流程。生成器函数在定义时使用function*语法,调用时返回一个生成器对象(Generator Object),而非直接执行函数体。

生成器对象遵循迭代器协议(Iterator Protocol),可通过next()方法逐步执行代码,每次遇到yield时暂停,并返回一个包含valuedone属性的对象。valueyield后的表达式值,done表示生成器是否执行完毕。


语法特性

  1. 定义方式
    使用function*声明生成器函数:

    function* generatorFunc() {yield 1;yield 2;return 3;
    }

  2. yield关键字
    yield用于暂停函数执行并返回一个值,后续调用next()时从暂停处继续执行。

  3. 迭代器协议
    生成器函数返回的迭代器对象符合迭代器协议,包含next()return()throw()方法。

  4. yield*委托
    用于委托给另一个生成器或可迭代对象:

    function* generatorA() {yield 1;
    }
    function* generatorB() {yield* generatorA();
    }


应用场景

  1. 惰性求值生成器适合处理大数据集或无限序列,仅在需要时计算值。例如生成斐波那契数列:

    function* fibonacci() {let [a, b] = [0, 1];while (true) {yield a;[a, b] = [b, a + b];}
    }
    const fib = fibonacci();
    console.log(fib.next().value); // 0
    console.log(fib.next().value); // 1

  2. 异步流程控制生成器可用于简化异步代码,结合yield暂停特性,实现类似同步的异步操作写法。例如:

    function* fetchUser() {const response = yield fetch('https://api.example.com/user');const data = yield response.json();return data;
    }
    const generator = fetchUser();
    const promise = generator.next().value;
    promise.then(response => {return generator.next(response).value;
    }).then(data => {console.log(generator.next(data).value);
    });

  3. 状态机
    生成器天然适合实现状态机逻辑,每个yield代表一个状态节点:

    function* trafficLight() {while (true) {yield 'red';yield 'yellow';yield 'green';}
    }
    const light = trafficLight();
    light.next().value; // 'red'
    light.next().value; // 'yellow'


注意事项

  • 执行顺序:生成器函数在首次调用next()时才开始执行,而非声明时。
  • 错误处理:可通过generator.throw()向生成器内部抛出错误,需在函数体内用try/catch捕获。
  • 资源清理:若提前终止生成器,应调用generator.return()释放资源。
  • 兼容性:旧版浏览器需通过Babel等工具转译。


优化建议

  • 避免频繁创建:对性能敏感场景,复用生成器对象而非重复创建。
  • 结合for...of:遍历生成器时使用for...of语法更简洁:
    for (const value of fibonacci()) {if (value > 100) break;console.log(value);
    }

  • Promise配合:使用库如co或异步生成器(ES2018)进一步简化异步代码:
    async function* asyncGenerator() {yield await Promise.resolve(1);
    }


总结

生成器函数提供了一种控制执行流程的灵活机制,适用于异步编程、惰性计算和状态管理等场景。尽管现代JavaScript已引入async/await处理异步操作,生成器仍在特定场景下具有独特优势。合理使用生成器能提升代码可读性和维护性,但需注意其执行特性和性能开销。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/946042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 年门窗工厂最新推荐排行榜:聚焦精湛工艺与先进技术,精选江苏、广东等地十家优质企业,为消费者选购提供可靠参考

引言 当前门窗市场产品质量参差不齐,部分厂家为逐利偷工减料,使用劣质原材料,导致产品安全性能低、隔热保温效果差;行业工艺水平差距大,小型工厂因设备和技术人员不足,产品密封性、抗压性不达标,易出现漏水、变…

如何构建高效 AI 智能体 - 详解

如何构建高效 AI 智能体 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&quo…

数字人公司:技术引领的数字人产业革新典范

技术引领的数字人产业革新典范 在科技日新月异的今天,数字人企业正以前所未有的速度改变着我们的生活方式与工作模式。它们不仅代表了人工智能技术的最新成果,更是未来交互方式的重要探索者。本文将带您深入了解数字…

数字人公司|数字人服务商生态全景

数字人公司:技术革新引领产业新风向 在人工智能与元宇宙浪潮的交织下,数字人正从科幻概念走向现实应用,成为企业数字化转型的关键载体。从虚拟主播到智能客服,从教育陪伴到医疗导诊,数字人正以高度拟人化的交互能…

高处作业安全 “智能监考”!思通数科 AI 卫士 + 安全帽摄像头杜绝防护违规

在建筑施工现场高处作业(如外墙施工、脚手架作业)安全管理中,传统人工监管始终面临 “视线受阻、细节难查、响应滞后” 的痛点:作业人员身处高空,地面巡检难以看清安全帽是否系带、安全带是否规范系挂(如低挂高用…

AI|国内GEO优化公司全链路优化

AI优化企业:智能时代下的增长新引擎 AI优化企业排行榜与技术革新,解码2025年企业增长密码 AI优化企业如何重构商业生态? 第一部分:AI优化企业排行榜——技术驱动的头部玩家 在生成式AI重构商业规则的2025年,企业竞…

面对大学里琳琅满目的证书考试,你的该问题非常关键——在有限的时间和精力下,做出最有价值的选择

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java-SE Day6

Java 异常Java 把异常当作对象处理,并定义一个基类java.lan.Throwable 作为所有异常的超类异常分为两大类 : Error 和 Exception **Error **类对象由 JVM 生成并抛出,大多数与代码编写者所执行操作无关 Exception 有…

Java-SE DAY3

JAVA 方法Java 方法是语句的集合,它们在一起执行一个功能。 设计方法的原则:一个方法只完成1个功能,这样利于我们后期扩展 方法包含一个方法头和一个方法体public static int add(int a,int b){ // static 声明类…

Java-SE Day4

面向对象Java 的核心思想就是OOP(面向对象变成)属性+方法 = 类 面向过程思想:步骤清晰简单,1-->2-->3...... 适合一些较为简单的问题 面向对象思想:物以类聚,分类的思维,将相同的方法放置一起构建成类,面…

深入解析:C语言内存布局:虚拟地址空间详解

深入解析:C语言内存布局:虚拟地址空间详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

Java-SE Day5

继承子类可继承父类所有的public 方法/属性 在Java 中,所有的类,都默认直接或间接继承Object 类java 类中只有单继承,没有多继承,只能继承一个父类(无法继承多个) ​ 私有的东西(方法/类)无法被继承 // 继承…

AI|AI优化公司:智能搜索时代的企业增长新引擎

AI优化企业:智能搜索时代的企业增长新引擎 解码AI优化企业技术实力,重构数字营销新生态 AI优化企业如何重塑品牌竞争力? 在生成式AI重构信息生态的2025年,企业搜索优化已从传统关键词堆砌跃迁至语义理解与智能决策…

年度 Demo Day!见证语音 AI 年度场景诞生!丨Convo AIRTE2025

「Voice Agent Camp 创新场景暨第五届 RTE 年度 Demo Day」是 RTE2025 大会的一部分。这将是一场对话式 AI 和 Voice Agent 创新场景的年度大赏!听腻了那些类比电影《Her》却无法真实落地的语音 AI 畅想?不妨亲临现场…

科学数据规模化迁移:Benchling从EAV模型转向JSONB的性能优化实践

本文详细介绍了Benchling工程团队如何将其核心数据模型从传统的实体-属性-值(EAV)模型迁移到PostgreSQL的JSONB格式,以解决数据量增长带来的性能瓶颈。通过分阶段 rollout 策略,实现了最高7倍的检测结果摄取速度提升…

October 25,2025

October 25,2025October 25,2025 Today is Saturday,and its windy.I went to the company to work as usual,but this is considered overtime.Because there are two days to rest in week.Today I feel happy and …

奶奶都能看懂的 C++ —— vector 与迭代器

本文用通俗易懂的方式讲解C++中vector容器和迭代器的使用方法,包括vector的初始化、元素操作,以及如何用迭代器遍历序列。迭代器 (iterator),顾名思义就是能够遍历一组对象的东西。 但是在讲解它之前,我们需要先了…

AI|AI优化公司智能GEO优化解决方案

AI优化企业:智能搜索时代的流量密码与行业标杆 解码AI优化企业排名,揭秘技术驱动的数字增长新范式 AI优化企业如何重构搜索生态?从技术到商业的全链路实践 在生成式AI重塑信息生态的2025年,企业流量获取已从传统SE…

2025年10月深圳离婚律师推荐榜:五强对比与选择指南

正在办理或准备办理离婚手续的深圳居民,普遍面临“找谁更靠谱”的焦虑:财产种类复杂、抚养权争议大、证据链薄弱、对方隐匿资产、涉外因素叠加,任何一环出错都可能让权益缩水。深圳市司法局2024年公开数据显示,全市…

2025年10月杭州丝绸购买榜:万事利湖滨步行街店权威排行

“我想挑一块真正代表杭州韵味的丝绸,送国外导师做纪念,可景区周边小店真假难辨,怕买到混纺。”——这是过去一个月里,我在湖滨步行街被游客反复问到的同一句话。杭州丝绸年零售额已突破180亿元,但“真丝含量”“…