生成器是可暂停和恢复执行的特殊函数,调用后返回实现迭代器协议的生成器对象;通过function*声明、yield暂停、next()驱动,适合懒求值、状态机与异步流程控制。

Generator(生成器)是 JavaScript 中一种特殊的函数,它能**暂停和恢复执行**,每次调用 next() 方法时返回一个 { value, done } 对象,适合按需生成数据、实现协程或处理异步流程。
如何创建生成器函数?
在普通函数关键字 function 后加一个星号 *,函数体内使用 yield 暂停执行并输出值。
- 函数声明写法:
function* myGenerator() { yield 1; yield 2; } - 函数表达式写法:
const gen = function*() { yield 'a'; yield 'b'; }; - 对象方法简写:
const obj = { *gen() { yield 1; } }; - 类中定义:
class C { *gen() { yield 'hello'; } }
生成器函数调用后返回什么?
调用生成器函数**不会立即执行**,而是返回一个生成器对象(Generator Object),它实现了迭代器协议,拥有 next()、return()、throw() 方法。
-
gen().next()开始执行,直到遇到第一个yield或函数结束 - 后续再调用
next()会从上次暂停位置继续执行 - 函数执行完毕后,
done变为true,value是return的值(或undefined)
yield 和 return 的区别
yield 是暂停点,可多次出现;return 是终止点,执行后生成器状态变为 done: true。
立即学习“Java免费学习笔记(深入)”;
-
yield 10→ 返回{ value: 10, done: false } -
return 'end'→ 返回{ value: 'end', done: true } - 没有显式
return,默认返回{ value: undefined, done: true }
常见用途示例
生成器天然适合做懒求值序列、状态机、异步控制流(配合 co 或 async/await 原理)。
- 无限自然数序列:
function* naturals() { let i = 0; while (true) yield i++; } - 遍历树结构(深度优先):
function* walk(node) { if (!node) return; yield node.value; yield* walk(node.left); yield* walk(node.right); } - 模拟异步步骤:
function* fetchFlow() { const a = yield fetch('/a'); const b = yield fetch('/b'); return [a, b]; }
基本上就这些。掌握 function*、yield、next() 三个核心,就能用好生成器。不复杂但容易忽略它的“可暂停”本质——它不是一次性算完,而是一步一取。











