Generator函数天然支持惰性求值,每次调用next()才执行到下一个yield并返回值,状态暂停保留;yield右侧表达式仅在调用时求值,无限序列、条件分支和迭代消费均按需触发计算。

Generator 函数天然支持惰性求值——它不会一次性执行完所有逻辑,而是每次调用 next() 时才计算并返回下一个值。
Generator 的执行是暂停-恢复式的
函数体内的代码只在每次 next() 调用时执行到下一个 yield 表达式为止,之后暂停,状态(如局部变量、执行位置)被保留。这正是惰性求值的核心机制。
-
function*定义的 Generator 返回一个迭代器对象,不是立即执行函数体 -
yield是暂停点,也是值的产出点;yield后的表达式仅在该次next()被调用时求值 - 没有调用
next(),yield右侧的计算(比如耗时操作、API 请求、大数组遍历)根本不会发生
用 Generator 实现无限序列的惰性生成
比如生成斐波那契数列:无需预先算出全部项,只在需要时算下一项。
function* fibonacci() {
let a = 0, b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}调用方式:
立即学习“Java免费学习笔记(深入)”;
-
const fib = fibonacci();—— 此时什么都没算 -
fib.next().value→0(算第 1 项) -
fib.next().value→1(算第 2 项) -
fib.next().value→1(算第 3 项) - 想取前 5 项?
Array.from({ length: 5 }, () => fib.next().value)—— 只执行 5 次计算
结合条件判断做按需计算
可以在 yield 前加逻辑,让某些分支根本不执行。
function* maybeExpensive() {
console.log('开始');
yield '第一步';
if (Math.random() > 0.5) {
console.log('执行昂贵操作...');
const result = heavyComputation(); // 这行可能根本不运行
yield result;
}
yield '结束';
}如果消费者只取前两个值,且随机条件不满足,“昂贵操作”就永远不会触发。
与 Iterator 协议无缝配合,自然融入惰性链式操作
Generator 返回的迭代器可直接用于 for...of、展开运算符、Array.from 等,这些语法内部逐次调用 next(),保证求值节奏由消费方控制。
-
[...fibonacci()].slice(0, 10)—— 看似“展开全部”,实则只触发 10 次next() -
for (const n of fibonacci()) { if (n > 1000) break; console.log(n); }—— 遇到条件即停,后续项永不计算 - 配合
filter、map等自定义惰性工具函数,能构建清晰的处理流水线
Generator 的惰性不是靠额外封装实现的,而是语言层面的设计特性。只要把计算逻辑写在 yield 后面,并通过迭代器接口消费,就自动获得按需求值能力。


















