讲师中心 微信公众号
AI工具推荐 视频效率加速

javascript生成器是什么_yield关键字如何使用?

云晨姑娘_9874

云晨姑娘_9874

发布时间:2026-01-10 21:10:43

|

172人浏览过

|

来源于php中文网

原创

<p>生成器函数用 function* 定义,调用返回 Generator 对象而非执行函数体;首次调用 .next() 才开始执行,yield 暂停并双向传值;支持 return、throw、return 方法控制退出与异常。</p>

javascript生成器是什么_yield关键字如何使用?

JavaScript 生成器函数怎么定义和调用?

生成器函数不是普通函数,它返回一个 Generator 对象,这个对象是可迭代的、可暂停/恢复的。定义时必须用 function* 语法(星号紧贴 function 关键字,不能有空格),调用后不立即执行函数体,而是返回一个生成器实例。

常见错误:写成 function *myGen()(星号前有空格)或 function myGen*()(星号位置错),会导致语法错误;或者直接调用 myGen() 后试图取返回值,却发现返回的是 Generator 对象而非预期结果。

  • function* 是必需语法,* 属于函数声明的一部分,不是修饰符
  • 调用生成器函数(如 gen())只创建并返回生成器对象,**不执行任何 yield 行**
  • 真正开始执行要靠第一次调用 .next()
  • 生成器对象本身不可被 JSON.stringify,也不支持展开运算符直接解构(需先遍历)

yield 是如何暂停和传值的?

yield 不是返回值后结束,而是“暂停执行,并把右侧表达式的值作为 { value: ..., done: false } 中的 value 返回”。下次调用 .next() 时,从 yield 下一行继续,且上一次 .next(arg) 传入的 arg 会成为当前 yield 表达式的计算结果(即赋给左侧变量)。

容易忽略:第一次 .next() 传参会被忽略(因为还没走到任何 yield 等待接收),只有后续调用才生效。

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

chartjs-reporter
chartjs-reporter

此技能用于在用户需要将结构化数据(查询结果、CSV 摘要、JSON 记录或 Python 字典/列表)转换为独立的 HTML 页面时使用。

下载
function* counter() {
  let count = 0;
  while (true) {
    const step = yield count; // 暂停,返回 count;恢复时,step = .next() 传入的值
    count += step || 1;
  }
}
<p>const gen = counter();
gen.next();     // { value: 0, done: false }
gen.next(5);    // { value: 5, done: false } → step = 5,count 变成 5
gen.next();     // { value: 6, done: false } → step = undefined,count 变成 6

生成器退出和异常处理要注意什么?

生成器可通过 return 提前结束(此时 done: true,value 为 return 的值),也可被 .throw() 强制抛出异常——如果生成器内部用 try...catch 捕获了,就不会终止;否则生成器立刻关闭,后续 .next() 全部返回 { value: undefined, done: true }。

  • .return(value) 会强制结束生成器,返回 { value, done: true },跳过剩余 yield
  • .throw(err) 把错误注入当前暂停点,等效于在那个 yield 行抛出 err
  • 没捕获的异常会让生成器进入 completed 状态,不能再继续
  • 使用 for...of 遍历时,内部自动调用 .next(),但不会触发 .throw() 或 .return(),异常会冒泡到循环外

实际项目中哪些场景适合用生成器?

生成器的核心价值是“可控的、带状态的迭代逻辑”,不是为了替代 async/await(虽然早期曾被用于手写协程)。现在典型用途集中在:自定义迭代器、状态机建模、配合 co 库处理异步(已过时)、以及某些算法需要分步产出(如树的深度优先遍历、无限序列生成)。

注意:现代代码中绝大多数异步场景应优先用 async/await;生成器若混用 Promise 又不借助运行时库(如 co),容易写出难以调试的“回调地狱变体”。

  • 实现自定义 [Symbol.iterator] 时,function* 是最简洁方式(比如让一个类支持 for...of)
  • 生成斐波那契、素数等无限序列时,yield 天然避免一次性计算全部
  • 表单多步骤校验、游戏 AI 决策流程等状态流转复杂逻辑,可用生成器封装步骤与转移条件
  • 不要用生成器替代 setTimeout 或 requestIdleCallback 做节流——它不释放 JS 主线程

生成器的暂停/恢复机制依赖引擎调度,不是真正的多线程;一旦生成器内部陷入死循环或长时间同步计算,整个脚本仍会卡住。真正关键的,是理解 yield 的双向通信本质:它既向外输出值,也向内接收下一次的输入。

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2175

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3382

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1136

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3899

2025.09.10

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6144

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3064

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1812

2025.10.17

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4358

2023.08.10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.7万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn