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