JavaScript生成器函数用function*定义,yield暂停并产出值,返回可迭代对象;调用不执行函数体,需next()推进,for...of自动遍历yield值但忽略return终值,next(value)支持双向通信,可配合执行器处理异步但现代推荐async/await。

JavaScript 中生成器函数通过 function* 语法定义,配合 yield 暂停执行,并返回一个可迭代的生成器对象;调用它不会立即运行函数体,而是返回一个能按需推进的迭代器。
定义和基础调用
生成器函数以 function* 开头,内部用 yield 表达式逐次产出值。每次调用生成器对象的 next() 方法,函数会从上次暂停处继续,直到下一个 yield 或结束。
- 定义:
function* count() { yield 1; yield 2; return 3; } - 调用:
const gen = count();—— 此时函数未执行 - 推进:
gen.next()返回{ value: 1, done: false };再调一次得{ value: 2, done: false };第三次得{ value: 3, done: true }
用 for...of 自动遍历
for...of 会隐式调用生成器的 next(),跳过 return 的终值(即不输出 value: 3 那次),只遍历所有 yield 出的值。
-
for (const n of count()) { console.log(n); }输出1和2 - 若需捕获终值,仍需手动调用
next()
向生成器传入数据(双向通信)
next(value) 的参数会作为上一个 yield 表达式的返回值,实现外部向内部传参。
立即学习“Java免费学习笔记(深入)”;
function* echo() { while (true) { const input = yield; console.log(input); } }const e = echo(); e.next(); e.next('hello'); // 输出 'hello'- 首次
next()用于启动生成器,不带参数(或带参数也无效),之后每次next(x)的x成为前一个yield的结果
配合异步逻辑(如模拟 async/await)
生成器本身不处理异步,但可与 co 库或手写执行器配合,把 yield 后的 Promise 自动 await。
function* fetchUser() { const res = yield fetch('/api/user'); return res.json(); }- 需执行器驱动:接收
yield出的 Promise,await完后将结果传回next() - 现代开发中更推荐直接用
async function,生成器主要用于底层控制流抽象或特殊迭代场景


















