生成器函数是 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 】
相关推荐:
漫蛙app官方版手机正版入口-漫蛙漫画manwa在线漫画正版入口
多多买菜门店端app订单查看方法
如何在CSS中使用absolute实现登录弹窗居中_transform translate结合
中通快递官网指定查询 中通快递单号查询平台入口
PointNet++语义分割模型中类别变更引发的断言错误及标签处理策略
AO3中文版手机快速通道_AO3最新稳定链接更新
Sublime怎么配置YAML文件格式化_Sublime YAML Formatter插件教程
百度地图离线地图无法加载如何解决 百度地图离线地图加载优化方法
服装短视频如何起号推广?服装短视频起号推广有什么要求?
PHP中获取HTTP响应状态消息:方法与限制
美发店速赢秘籍
Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题
动漫岛汉化官网网 动漫岛官方动漫汉化地址
电脑双系统如何安装和卸载 Windows和Linux双系统安装教程【详解】
什么是Satis,如何用它搭建一个私有的composer仓库?
智云Q3和Q2有什么升级_智云Q3与Q2手持云台功能与性能对比分析
智学网成绩单查询系统网_智学网学生平台登录
Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧
mysql如何回滚事务_mysql ROLLBACK事务回滚方法
C++二维数组动态分配方法_C++指针与数组内存布局
Excel如何快速找到并断开外部数据源链接_Excel外部数据源断开方法
mysql如何管理数据库账户_mysql数据库账户管理技巧
我居然低估了 DeepSeek,这次更新它做到了这些!
芒果TV官网登录入口 芒果TV官方网站登录入口
C++如何实现矩阵乘法_C++二维数组矩阵运算代码示例
Lar*el Eloquent中通过Join查询关联数据表:解决多行子查询问题
windows10怎么开启wsl_windows10安装linux子系统教程
跨语言测试实践:使用Python Selenium测试现有J*a Web项目
圆通快递官方入口不需要登录 在线查询入口快速查询
猫眼app抢票快还是小程序快
《猎聘》筛选猎头岗位方法
J*aScript对象中深度嵌套URL键的查找与更新策略
如何测试您的网站全球打开速度-网站海外测速工
TikTok私信无法发送表情怎么办 TikTok消息表情发送修复方法
汽水音乐在线入口 汽水音乐网页端官方页面快速打开
《三国:谋定天下》平民全阶段通用阵容
如何自定义苹果手机铃声
c++类和对象到底是什么_c++面向对象编程基础
composer licenses 命令:如何检查项目依赖的许可证?
大熊猫抓取竹子的“大拇指”其实是什么?蚂蚁庄园课堂今天答案最新11月30日
MySQL多重关联查询:利用别名高效获取同一表的多个关联字段
背部总是隐隐作痛怎么回事 背痛如何改善
Apple Music无故扣费引质疑
CSS如何使用outline-offset与颜色组合突出元素边框
iPhone16Plus参数配置如何调整声音_iPhone16Plus参数配置声音调整详细方法
J*aScript字符串_Unicode处理
Golang如何初始化module项目_Golang module init使用说明
《下一站江湖2》武器获取方法
宝妈做视频号该写什么标签话题?宝妈关注的话题有哪些?
《随手记》启用语音备注方法
2025-12-18
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。