带有 * 标记的函数被称为生成器函数。
普通函数执行并返回结果。但是生成器会产生值,并等待它们再次被调用。然后函数将恢复其执行。
生成器函数通常是可迭代的。由于它们生成值并等待下一个函数调用来恢复执行,因此它们非常适用于无限值生成器。
它们也很节省内存。例如,假设您想生成10000000个数字,如果我们将它们存储在一个数组中,可能会耗尽机器的内存。但是如果我们使用生成器,我们可以生成一个数字,产生值,当再次调用时,执行将恢复并且可以生成下一个数字。
我们可以查看这里的例子。
function* fibonacci() {
let [prev, curr] = [0, 1];
for (;;) { // Infinite looping
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
for (n of fibonacci()) {
// truncate the sequence at 1000
if (n > 1000)
break;
print(n);
}
可以看出,生成器函数实际上具有无限循环。当执行 yield curr
时,值将返回到 n of fibonacci()
中的 n
。这在迭代中使用,当再次调用生成器时,它会恢复执行(还保留变量中的数据)并生成下一个元素。