0

0

javascript生成器是什么_yield关键字有什么作用?

幻影之瞳

幻影之瞳

发布时间:2026-01-04 22:47:02

|

999人浏览过

|

来源于php中文网

原创

生成器函数是用function声明的可暂停/恢复执行的特殊函数,返回generator实例,本质为协程雏形;yield实现双向通信与惰性计算,yield委托迭代;适用于无限序列、手动异步控制及状态机建模。

javascript生成器是什么_yield关键字有什么作用?

生成器函数是能暂停/恢复执行的特殊函数

JavaScript 生成器不是普通函数,它用 function* 声明,返回一个可迭代对象Generator 实例),本质是**协程雏形**——执行中途能停住、保存全部上下文(变量、作用域、执行位置),等你调用 next() 再继续。这不是语法糖,而是运行时机制级支持。

常见错误现象:直接调用 myGenerator() 不会执行函数体,只返回一个 Generator 对象;试图用 for...of 遍历但忘了它内部必须有 yield,结果循环不触发任何产出。

  • 必须用 next() 触发执行,首次调用才开始运行到第一个 yield
  • 每次 next() 返回 { value: ..., done: false/true },不是裸值
  • 生成器一旦 done: true,后续 next() 永远返回 { value: undefined, done: true }

yield 是暂停点,也是双向通信接口

yield 不是 return 的替代品,它是“暂停并交出控制权”的指令。关键在于:它既能向外产出值,也能向内接收值——下一次 next(value) 传入的参数,会成为当前 yield 表达式的返回值。

function* counter() {
  let n = 0;
  while (true) {
    n = yield n; // ← 这里:产出 n,暂停;恢复时,传入的值赋给 n
  }
}
<p>const gen = counter();
gen.next();     // { value: 0, done: false }
gen.next(10);   // { value: 10, done: false } → n 变成 10
gen.next(100);  // { value: 100, done: false }</p>
  • 首次 next() 传参会被忽略(没地方接)
  • yield 后面的表达式只在暂停时求值,实现惰性计算
  • 若想让生成器提前结束,可用 gen.return(value) 或抛错 gen.throw(err)

yield* 是委托迭代,不是调用子函数

yield* 的核心作用是“把当前生成器的控制权透明转交给另一个可迭代对象”,包括其他 GeneratorArrayStringMap 等。它不是执行完子生成器再继续,而是像管道一样串联迭代流。

魔法映像企业网站管理系统
魔法映像企业网站管理系统

技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作

下载

立即学习Java免费学习笔记(深入)”;

function* numbers() {
  yield 1;
  yield* [2, 3];      // ← 委托给数组,自动展开
  yield 4;
}
<p>[...numbers()]; // [1, 2, 3, 4]</p>
  • yield* iter 中的 iter 必须是可迭代对象(有 [Symbol.iterator]
  • 子迭代器的 throw()return() 会透传回父生成器,错误传播是连通的
  • 别写成 yield* someGenerator() 而不赋值——那只是创建并丢弃一个新生成器实例,没意义

实际用在哪?别硬套,先看这三类刚需场景

生成器不是炫技工具。真正值得用的地方很具体:

  • 无限序列或大数据:比如斐波那契、日志轮转、分页请求缓存——按需生成,不占内存
  • 手动控制异步流程:配合 co 库或手写 runner,把 Promise 链变成同步写法(虽然后来被 async/await 覆盖,但理解它有助于读懂老项目)
  • 状态机建模:游戏 AI、表单步骤、协议解析——每个 yield 是一个稳定状态,next() 是外部触发的事件

容易被忽略的一点:生成器函数本身不能 await,但可以用 async function* 创建异步迭代器(ES2018+),这时 yield 产出的是 Promise,需搭配 for await...of 使用——这是两个不同层级的特性,混用前务必确认目标环境支持。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

990

2023.08.02

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1878

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

656

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2384

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

77

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

40

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.11.17

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.9万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号