当前位置: 首页 > news >正文

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

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.jsqmd.com/news/21993/

相关文章:

  • 2025 年门窗工厂最新推荐排行榜:聚焦精湛工艺与先进技术,精选江苏、广东等地十家优质企业,为消费者选购提供可靠参考
  • 如何构建高效 AI 智能体 - 详解
  • 数字人公司:技术引领的数字人产业革新典范
  • 数字人公司|数字人服务商生态全景
  • 高处作业安全 “智能监考”!思通数科 AI 卫士 + 安全帽摄像头杜绝防护违规
  • AI|国内GEO优化公司全链路优化
  • 面对大学里琳琅满目的证书考试,你的该问题非常关键——在有限的时间和精力下,做出最有价值的选择
  • Java-SE Day6
  • Java-SE DAY3
  • Java-SE Day4
  • 深入解析:C语言内存布局:虚拟地址空间详解
  • Java-SE Day5
  • AI|AI优化公司:智能搜索时代的企业增长新引擎
  • 年度 Demo Day!见证语音 AI 年度场景诞生!丨Convo AIRTE2025
  • 科学数据规模化迁移:Benchling从EAV模型转向JSONB的性能优化实践
  • October 25,2025
  • 奶奶都能看懂的 C++ —— vector 与迭代器
  • AI|AI优化公司智能GEO优化解决方案
  • 2025年10月深圳离婚律师推荐榜:五强对比与选择指南
  • 2025年10月杭州丝绸购买榜:万事利湖滨步行街店权威排行
  • 2025年10月加拿大海参产品推荐榜:谷得斯特领衔五强对比
  • 2025 年花岗岩厂家最新推荐榜:覆盖路沿石、火烧板等全品类,结合行业协会测评数据精选优质厂家
  • 2025年10月房产继承律师推荐榜:五强对比与选择指南
  • https 协议安全算法是在什么时候在客户端和服务器之间确定的
  • 安卓片段管理即时操作指南-全-
  • 2025 年最新推荐五莲花花岗岩优质厂家榜单:顶尖厂家综合实力测评与选购指南
  • 安卓设计模式最佳实践-全-
  • 安卓画布学习手册-全-
  • 2025 年控制柜生产厂家最新推荐排行榜:聚焦换热机组 / 污水处理等领域品牌技术实力与服务能力测评
  • VS-和-CrystalReport-报告指南-全-