JavaScript 生成器是一种能**暂停和恢复执行**的特殊函数,它不是一次性跑完,而是按需“走一步、停一步”,适合处理需要分段产出数据或控制流程的场景。核心在于 function* 声明方式和 y
ield 关键字的配合。
必须用 function*(星号紧贴 function 或函数名都可)声明,调用时不会立即执行,而是返回一个生成器对象——这个对象本身就是一个迭代器。
next() 方法,每次调用就推进到下一个 yield 或函数结束next() 返回形如 { value: ..., done: true/false } 的对象yield 值都会被依次产出;return 的值也会出现在 value 中,但 done 变为 true
yield 是生成器的“暂停开关”:它交出一个值,同时冻结当前函数的所有状态(变量、执行位置等),等待下一次 next() 唤醒。
return 会立刻退出yield 后面的表达式是惰性求值的——只有调用 next() 时才计算gen.next('hello') 中的 'hello' 会成为上一个 yield 表达式的返回值,实现双向通信生成器对象自动实现了 Symbol.iterator 接口,因此能直接用于:
for...of 循环(但注意:return 值不会被循环捕获)[...myGenerator()]
const [a, b] = myGenerator();
当一个生成器需要复用另一个生成器或遍历数组/字符串等可迭代对象时,用 yield* 更简洁:
yield* anotherGenerator() 直接把控制权交给对方,逐个产出它的 yield 值yield* [1, 2, 3] 等价于手动写三个 yield,适合扁平化嵌套结构