0

0

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

狼影

狼影

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

|

152人浏览过

|

来源于php中文网

原创

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

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免费学习笔记(深入)”;

Python开发网站指南 WORD版
Python开发网站指南 WORD版

本文档主要讲述的是Python开发网站指南;HTML是网络的通用语言,一种简单、通用的全置标记语言。它允许网页制作人建立文本与图片相结合的复杂页面,这些页面可以被网上任何其他人浏览到,无论使用的是什么类型的电脑或浏览器 Python和其他程序语言一样,有自身的一套流程控制语句,而且这些语句的语法和其它程序语言类似,都有for, if ,while 类的关键字来表达程序流程。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载
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: truevaluereturn 的值),也可被 .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 决策流程等状态流转复杂逻辑,可用生成器封装步骤与转移条件
  • 不要用生成器替代 setTimeoutrequestIdleCallback 做节流——它不释放 JS 主线程

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

452

2023.08.07

json是什么
json是什么

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

546

2023.08.23

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

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

328

2023.10.13

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

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

81

2025.09.10

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

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

1561

2023.10.24

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

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

241

2024.02.23

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

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

128

2025.10.17

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

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

723

2023.08.10

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

0

2026.03.04

热门下载

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

精品课程

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

共58课时 | 5.7万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.2万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.5万人学习

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

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