Generator 是 JavaScript 中能暂停和恢复执行的特殊函数,用 function* 声明、yield 暂停、next() 控制节奏,实现协作式控制流而非并发。

Generator 是 JavaScript 中一种特殊的函数,它能暂停和恢复执行,让你在函数内部精确控制代码运行的节奏,而不是像普通函数那样一气呵成跑完。
Generator 函数长什么样
它用 function* 声明(星号可紧贴 function 或函数名),内部用 yield 暂停执行,并返回一个值。每次调用它的 next() 方法,函数就从上次暂停处继续,直到下一个 yield 或结束。
例如:
function* count() {yield 1;
yield 2;
return 'done';
}
const it = count();
it.next(); // { value: 1, done: false }
it.next(); // { value: 2, done: false }
it.next(); // { value: 'done', done: true }
它如何实现“可控执行”
Generator 不是靠定时器或条件判断来控制流程,而是通过迭代器协议把函数执行权交还给调用者。每次 next() 都是一次明确的“请继续一步”,函数只在被请求时才动一下。
立即学习“Java免费学习笔记(深入)”;
- yield 是暂停点:遇到 yield 就停住,把值交出去,等待下一次 next 才继续
- next() 可传参:传入的值会变成上一个 yield 表达式的返回值,实现外部向内部“注入”数据
- throw() 和 return() 也能中断:主动抛错或提前结束,让 Generator 进入完成态
常见用途场景
Generator 的核心价值在于把异步逻辑写得像同步一样清晰,虽然现在多用 async/await,但它仍是理解协程、状态机和自定义迭代的基础。
- 实现自定义迭代器(比如遍历树、生成斐波那契数列)
- 配合 Promise 写异步流程(早期 co 库就是靠它自动执行)
- 构建状态机:每个 yield 对应一个状态,next() 触发状态迁移
- 处理大量数据流时分片执行,避免阻塞主线程
注意几个关键细节
Generator 函数本身不执行,只返回一个迭代器对象;它不能被 new 调用;yield 只能在 Generator 函数内使用,嵌套普通函数里会报错。
另外,Generator 不是线程,没有并发能力——它只是协作式控制流,所有操作仍在单线程中按序发生。










