generator函数是能暂停和恢复执行的特殊函数,调用返回迭代器对象,用function*定义、yield暂停产出值,支持next()手动控制或for...of自动遍历,适用于异步流程、惰性求值等场景。

Generator 函数是 JavaScript 中一种特殊的函数,能**暂停和恢复执行**,适合处理异步流程、惰性求值或遍历复杂数据结构。它不是普通函数,调用后不立即运行,而是返回一个迭代器对象。
定义 Generator 函数
用 function* 语法(星号可紧贴 function 或函数名,推荐写在 function 后),函数体内使用 yield 暂停并产出值:
function* count() {
console.log('开始');
yield 1;
console.log('继续');
yield 2;
yield 3;
console.log('结束');
}注意:
- yield 只能在 generator 函数内部使用,外部会报错
- return 也可用,会终结迭代,其值作为 done: true 时的 value
- 箭头函数不能定义 generator
调用与手动控制迭代
调用 generator 函数返回一个迭代器,需手动调用 next() 推进:
const it = count();
console.log(it.next()); // { value: 1, done: false }
console.log(it.next()); // { value: 2, done: false }
console.log(it.next()); // { value: 3, done: false }
console.log(it.next()); // { value: undefined, done: true }(无 return 时)每次 next():
- 恢复执行到下一个 yield 或函数结束
- 返回对象含 value(yield 后的值或 return 值)和 done(是否完成)
- 可向 next(value) 传参,该值会成为上一个 yield 表达式的返回值(用于双向通信)
配合 for...of 自动遍历
generator 对象默认可迭代,for...of 会自动调用 next(),忽略 return 值:
function* fib() {
let [a, b] = [0, 1];
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
<p>for (const n of fib()) {
if (n > 100) break;
console.log(n); // 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89
}</p>注意:
- for...of 不会捕获 return 的值
- 若 generator 无限(如上面的斐波那契),必须用 break 或其他逻辑终止,否则死循环
常见实用场景
Generator 的核心价值在于**控制权移交**,典型用途包括:
- 实现自定义迭代器(如树的中序遍历、文件行读取)
- 配合 co 库或手写 runner 处理 Promise 链(async/await 出现前的主流方案)
- 构建状态机(每个 yield 是一个状态点)
- 惰性序列生成(如无限列表、分页请求的“下一页”封装)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











