JavaScript生成器是什么_yield关键字怎么用?

JavaScript生成器是用function定义的特殊函数,返回迭代器对象;yield暂停执行并返回值,next()恢复并可传入参数;yield委托其他可迭代对象,支持按需计算与异步流程控制。

JavaScript生成器是一种特殊函数,能暂停和恢复执行,适合处理异步操作、大数据流或需要按需计算的场景。yield 是它的核心关键字,用来“交出”当前值并暂停函数,等下次调用再从暂停处继续。

生成器函数怎么定义?

在 function 关键字后加一个星号 *,就定义了一个生成器函数。它不会立即执行,而是返回一个迭代器对象:

function* count() {
  yield 1;
  yield 2;
  yield 3;
}

调用 count() 不会输出数字,只返回一个可迭代的对象,比如 const it = count();

yield 怎么工作?

每次调用迭代器的 .next() 方法,生成器就运行到下一个 yield 表达式,返回一个形如 { value: ..., done: ... } 的对象:

  • it.next(){ value: 1, done: false }
  • it.next(){ value: 2, done: false }
  • it.next(){ value: 3, done: false }
  • it.next(){ value: undefined, done: true }(已耗尽)

yield 可以接收外部传入的值

yield 不只是“往外抛”,还能“往里收”。下一次调用 .next(value) 时传的参数,会成为上一个 yield 表达式的返回值:

function* echo() {
  let input = yield 'ready';
  yield 'you said: ' + input;
}

使用示例:
const e = echo();
e.next(); // { value: 'ready', done: false }
e.next('hello'); // { value: 'you said: hello', done: false }

生成器可以委托其他生成器

yield* 可以把控制权“转交”给另一个可迭代对象(比如另一个生成器、数组、字符串),让它们依次产出值:

function* nums() { yield 1; yield 2; }
function* all() {
  yield 'start';
  yield* nums(); // 展开 nums 的所有 yield
  yield 'end';
}

结果:'start' → 1 → 2 → 'end'

基本上就这些。yield 不是魔法,它让函数变成可中断的协作式流程,配合 for...of、扩展运算符([...gen()])、async/await(通过包装)能写出更清晰的逻辑。不复杂但容易忽略细节。