JavaScript生成器是一种特殊的函数,它可以在执行过程中暂停,并在之后从暂停的位置继续运行。这种能力由function*语法和yield关键字共同实现,让函数不再一次性跑完,而是像迭代器一样逐段产出结果。

什么是JavaScript生成器
普通函数调用后会一直运行到结束或return,而生成器函数被调用时并不会立刻执行函数体,而是返回一个生成器对象。这个对象遵循迭代器协议,拥有next()方法,每次调用next()才会让函数体运行到下一个yield处暂停。
基本定义方式
使用function*来声明生成器函数,在函数内部通过yield输出值:
function* countGenerator() {
yield 1;
yield 2;
yield 3;
}
const gen = countGenerator();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: undefined, done: true }
yield关键字怎么用
yield相当于生成器里的暂停点,它后面的值会作为本次next()返回的value。同时,yield本身也是一个表达式,可以接收通过next(arg)传入的参数,从而实现双向通信。
向生成器传值
调用next时传入的参数会替代当前暂停处的yield表达式的值:
function* speak() {
const word = yield '请说话';
yield '你说了:' + word;
}
const g = speak();
console.log(g.next()); // { value: '请说话', done: false }
console.log(g.next('你好')); // { value: '你说了:你好', done: false }
用循环产出多个值
生成器常配合循环使用,避免一次性生成大数组占用内存:
function* idMaker() {
let id = 0;
while (true) {
yield id++;
}
}
const ids = idMaker();
console.log(ids.next().value); // 0
console.log(ids.next().value); // 1
生成器与迭代器关系
生成器对象本身就是迭代器,因此可以直接用于for...of循环,也可以被解构或展开:
function* list() {
yield 'a';
yield 'b';
yield 'c';
}
for (const item of list()) {
console.log(item);
}
// 输出 a b c
常见使用场景
- 处理大量数据时分批产出,节省内存
- 用同步写法组织异步逻辑,配合co等库使用
- 实现可暂停的业务流程,如步骤式表单
理解JavaScript生成器和yield关键字之后,你可以把复杂流程拆成可暂停、可恢复的片段,让代码逻辑更清晰,也更容易维护。
JavaScript生成器yield关键字迭代器修改时间:2026-07-30 15:42:20