生成器函数是 J*aScript 中用 function* 声明、通过 yield 暂停执行并返回迭代器对象的特殊函数,支持惰性求值、双向通信和可迭代协议。

生成器函数是 J*aScript 中一种特殊的函数,它能暂停和恢复执行,让你手动控制函数内部的运行节奏。它不是一次性跑完,而是一步一步“交出控制权”,每次只执行到一个 yield 就停下来,等你下次调用再继续——这种能力特别适合处理异步流程、惰性求值、状态机或分段数据处理。
生成器函数用 function* 声明(星号可紧贴 function 或函数名),内部用 yield 暂停执行。调用它不会立即运行,而是返回一个迭代器对象,你需要手动调用 next() 方法来驱动执行。
例如:
function* count() {
console.log('start');
yield 1;
console.log('after first yield');
yield 2;
return 'done';
}
<p>const it = count(); // 不执行函数体,只创建迭代器
console.log(it.next()); // { value: 1, done: false }
console.log(it.next()); // { value: 2, done: false }
console.log(it.next()); // { value: 'done', done: true }</p>注意:yield 后面的表达式只在 next() 被调用时才求值,实现真正的惰性计算。
next(value) 的参数会作为上一个 yield 表达式的返回值。这使得生成器可以和调用方双向通信,像一个可控的协程。
Chatbase
从你的知识库中构建一个AI聊天机器人
117
查看详情
next() 的参数会被忽略(因为还没走到任何 yield 等待接收)next(x) 中的 x,会变成前一个 yield 所在位置的计算结果
function* echo() {
while (true) {
const input = yield 'waiting...';
console.log('received:', input);
}
}
<p>const it = echo();
console.log(it.next()); // { value: 'waiting...', done: false }
console.log(it.next('hello')); // 控制台打印 'received: hello',返回 { value: 'waiting...', done: false }</p>只要生成器没提前 return,且所有 yield 都返回 done: false,它就符合可迭代协议。因此可以直接用 for...of 或 [...gen()] 自动消费所有 yield 值(但会忽略 return 的终值)。
for...of 只遍历 yield 出来的值,不关心 return
Array.from(gen()) 或 [...gen()] 效果一样,适合转成数组return 值,必须手动调用 next() 直到最后
function* range(n) {
for (let i = 0; i < n; i++) yield i;
return 'finished';
}
<p>for (const x of range(3)) {
console.log(x); // 0, 1, 2
}
// 'finished' 不会被 for...of 输出</p>虽然现在有 async/await,但生成器曾是实现协程式异步的关键(如早期的 co 库)。它的核心价值在于把异步逻辑写成同步风格,同时保持完全可控的暂停点。
yield promise 可被包装成自动 await 行为yield 对应一个状态,next() 触发状态迁移yield 实现按需计算,不爆内存例如惰性斐波那契生成器:
function* fibonacci() {
let a = 0, b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
<p>const fib = fibonacci();
console.log(fib.next().value); // 0
console.log(fib.next().value); // 1
console.log(fib.next().value); // 1
console.log(fib.next().value); // 2</p>基本上就这些。生成器不复杂,但容易忽略它和普通函数的本质区别:它返回的是迭代器,不是结果;它的执行权在你手上,不在 JS 引擎自动调度里。
以上就是j*ascript中的生成器函数是什么_如何使用它控制执行流程的详细内容,更多请关注其它相关文章!
# 如何实现
# 如皋网站推广优化
# 高邮seo公司
# 徐州网络营销推广制作
# 河源seo 易点互动
# 绍兴全网营销型网站建设
# seo路灯关键词
# 宁波营销推广课程培训
# 音乐的营销推广方法包括
# 旅游社网站营销推广方案
# 日照网站建设规范
# 的是
# 使用它
# javascript
# 如何将
# 多线程
# 求值
# 运算符
# 遍历
# 多个
# 迭代
# 区别
# ai
# js
# java
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
汽水音乐网页版登录 汽水音乐网页端官方入口
PHP utf8_encode 字符编码转换陷阱与解决方案
处理含命名空间的XML文件 Power Query中的高级技巧
天堂漫画网页版在线阅读 天堂漫画手机版入口
QQ网页版入口导航 QQ网页版在线访问通道
火狐浏览器如何刷新修复浏览器 火狐浏览器“重置Firefox”功能详解
如何快速去除厨房重油污? 2025年最好用的厨房清洁剂推荐
CSS如何控制元素外边距_margin实现布局间隔
哔哩哔哩黑名单怎么查看
PHP 4 函数中引用参数的默认值限制与解决方案
漫蛙官网(首页入口)_漫蛙漫画稳定访问教程分享
《360浏览器》自动保存账号密码设置方法
菜鸟驿站的取件码忘了怎么办 手机快速查询指南
KFC邀请码怎么使用领额外优惠_KFC邀请码输入方式与额外优惠代码获取方法
Google Drive API 认证:服务账户与OAuth 2.0的选择与实践
SQLAlchemy 2.0 与 Pydantic 模型类型安全集成指南
win11如何诊断DirectX问题 Win11运行dxdiag工具排查显卡故障【排错】
《蓝色星原:旅谣》坐骑获取攻略
暴风影音官网正式版_暴风影音手机版官网下载安卓
苹果SE如何开启单手模式_苹果SE单手操作功能
苹果11如何更换iCloud账号_苹果11账号切换的具体步骤
基于键值条件高效映射 Pandas DataFrame 多列数据
Win10锁屏时间怎么设置 Win10调整自动锁屏时间方法
外媒评《燕云十六声》DIY载具新玩法:很像《塞尔达传说王国之泪》!
动漫岛在线动漫网 动漫岛动漫在线观看官方入口
CodeIgniter 3 中基于 MySQL 数据高效生成动态图表教程
使用 .htaccess 正确配置 WordPress 子目录重定向与路径保留
如何使用CSS Grid实现“大方块左侧,小方块右侧垂直堆叠”的水平布局
热血江湖归来医师加点攻略
Retrofit根路径POST请求:@POST("/") 的应用与解析
济南公交卡手机充值指南
Google Drive API服务器端访问指南:服务账户认证详解
全球各国上班时间表外贸邮件时间
国际经济与贸易就业方向解析
J*a里如何处理ArithmeticException并防止除零_算术异常防护策略解析
Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题
QQ网站入口直接登录 QQ官方正版登录页面
如何修改Windows截图的默认保存位置_告别C盘让桌面更整洁【教程】
TikTok私信无法发送表情怎么办 TikTok消息表情发送修复方法
《跳跳舞蹈》循环播放方法
windows10怎么设置电源按钮_windows10按下电源键功能修改
《edge浏览器》关闭翻译功能方法
荣耀盒子应用管理技巧
PHP安全加载非公开目录图片与动态内容类型处理指南
Python中处理嵌套字典与列表的数据提取与过滤教程
批改网官网首页登录 批改网学生用户登录入口
感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30
惠普电脑BIOS界面看不懂怎么办_HP电脑BIOS功能选项解读与设置
六级准考证号怎么查_四六级准考证查询入口官网
Python实战:高效处理实时数据流中的最小/最大值
2025-12-18
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。