JavaScript生成器函数用function*声明,通过yield暂停执行并返回迭代器对象;每次调用next()从暂停处继续,yield可传值与接收外部输入,适用于惰性计算、自定义迭代及异步编程基础。

JavaScript的生成器函数是一种可以暂停和恢复执行的特殊函数,yield 是它的核心控制关键字——它让函数不再“一气呵成”,而是像按了暂停键一样,每次调用 next() 才继续往下走一步。
生成器函数怎么写?
用 function* 声明,内部用 yield 标记暂停点:
function* count() {
console.log('start');
yield 1;
console.log('after first yield');
yield 2;
console.log('end');
return 'done';
}调用它不会立即执行,而是返回一个**迭代器对象**:
const it = count(); // 没有打印任何内容
yield 怎么控制流程?
每次调用 it.next(),函数从上次暂停处(或开头)运行,直到遇到下一个 yield 或 return:
立即学习“Java免费学习笔记(深入)”;
-
it.next()→ 输出'start',返回{ value: 1, done: false } -
it.next()→ 输出'after first yield',返回{ value: 2, done: false } -
it.next()→ 输出'end',返回{ value: 'done', done: true }
yield 表达式的值就是 next() 返回的 value;函数结束时 done 变为 true。
yield 还能接收外部传入的值
下次调用 next(value) 时传入的参数,会成为上一个 yield 表达式的返回值:
function* echo() {
let input = yield 'ready?';
console.log(input); // 'hello'
yield 'got it';
}使用时:
-
it.next()→ 返回{ value: 'ready?', done: false } -
it.next('hello')→input得到'hello',打印并返回{ value: 'got it', done: false }
实际中常用来做什么?
生成器适合需要**分步、惰性、可中断**的场景:
- 实现自定义迭代逻辑(比如遍历树、分页请求)
- 配合
for...of自动遍历(只要没 return,done: false的 yield 都会被取) - 作为异步编程的早期基础(
async/await就是它的语法糖升级) - 构造状态机或协程式流程控制
基本上就这些。yield 不是魔法,只是把函数执行权交还给调用方,等你再点“播放”才继续——它让 JS 第一次拥有了真正可控的暂停能力。










