function 用于定义生成器函数,返回可暂停/恢复的生成器对象;yield 产出单值,yield 委托可迭代对象;生成器原生支持迭代协议,并可通过 next(value) 实现双向通信。

JavaScript 中的 function* 是定义生成器函数的关键字,它创建的函数会返回一个生成器对象(Generator Object),这个对象是一个迭代器,可以**暂停和恢复执行**,适合处理惰性求值、分步计算、异步流程控制等场景。
生成器函数的基本语法和行为
生成器函数用 function* 声明(* 紧跟在 function 后,空格可选),内部使用 yield 暂停执行并产出一个值。每次调用生成器对象的 next() 方法,函数就从上次暂停处继续运行,直到下一个 yield 或结束。
例如:
function* count() {yield 1;
yield 2;
yield 3;
}
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 }
yield 和 yield* 的区别
yield 产出单个值;yield* 则用于委托另一个可迭代对象(如另一个生成器、数组、字符串等),把它的遍历结果“展开”到当前生成器中。
立即学习“Java免费学习笔记(深入)”;
-
yield [1,2,3]:产出整个数组作为一个值 -
yield* [1,2,3]:逐个产出1、2、3 -
yield* anotherGenerator():把另一个生成器的每个yield值依次产出
生成器与迭代协议的天然契合
生成器函数自动实现 Symbol.iterator,所以生成器对象本身是可迭代的,能直接用于 for...of、扩展运算符 [...gen]、解构等:
let a = 0, b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
for (const n of fib()) {
if (n > 100) break;
console.log(n); // 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89
}
生成器也可接收外部传入的值(通过 next(value))
next() 方法可带参数,该参数会成为上一个 yield 表达式的返回值——这使得生成器具备双向通信能力,常用于协程式编程或状态机建模:
const name = yield "What is your name?";
yield `Hello, ${name}!`;
}
const q = ask();
console.log(q.next()); // { value: "What is your name?", done: false }
console.log(q.next("Alice")); // { value: "Hello, Alice!", done: false }
基本上就这些。生成器不是必须掌握的日常语法,但在需要精细控制执行流、封装异步逻辑(比如早期的 co 库)、或构建自定义迭代逻辑时,它提供了简洁而强大的表达力。











