Generator函数是能暂停和恢复执行的特殊函数,调用后返回迭代器对象;用function声明,yield暂停并返回值,next()控制流程,支持return()终止和throw()抛错,常用于自定义迭代器和yield委托。

Generator 函数是 JavaScript 中一种特殊的函数,能**暂停和恢复执行**,适合处理异步流程、惰性求值或自定义迭代逻辑。它不是普通函数,调用后返回一个迭代器对象,而不是直接运行函数体。
定义和基本语法
用 function*(星号紧贴 function 关键字)声明 Generator 函数。函数体内使用 yield 暂停执行,并向外部返回一个值。
例如:
function* count() {yield 1;
yield 2;
yield 3;
}
const iterator = count();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
控制执行流程
每次调用 next() 方法,Generator 从上次暂停处继续,直到遇到下一个 yield 或函数结束。
立即学习“Java免费学习笔记(深入)”;
- next() 可传参:参数会作为上一个 yield 表达式的返回值(注意:第一次 next() 传参无效)
- return() 方法:立即终止 Generator,返回指定 value,且 done 为 true
- throw() 方法:在暂停位置抛出异常,可被内部 try...catch 捕获
常见实用场景
实现自定义迭代器:让对象支持 for...of
const range = {*[Symbol.iterator]() {
for (let i = 0; i }
};
for (const n of range) console.log(n); // 0, 1, 2
简化异步流程(配合 Promise):虽已被 async/await 取代,但理解其原理有助于掌握协程思想。可用 co 库 或手动封装 runner 自动执行 yield 后的 Promise。
生成无限序列(惰性计算):如斐波那契数列,只在需要时计算下一项,不占内存。
注意事项
- Generator 函数不能被 new 调用(没有 [[Construct]] 内部方法)
- yield 只能在 Generator 函数内部使用,嵌套普通函数中无效
- 不能与箭头函数结合(=> 不支持 function* 语法)
- yield* 可委托给另一个可迭代对象或 Generator,用于组合多个生成器


















