在递归生成器函数中,yield后面的*(星号/星号)语法意味着什么

What does the * (star/asterisk) syntax after a yield mean in a recursive generator function?

本文关键字:星号 什么 意味着 语法 递归 函数 yield      更新时间:2023-09-26

假设我已经创建了一个ES6生成器

function *createFibonacciIterator(a = 0, b = 1) {
  yield b;
  yield *createFib(b, b + a); // <== QUESTION IS ABOUT THIS LINE
}

然后我使用该生成器来获得前20个结果

let fibber = createFibonacciIterator();
for (let ii = 0; ii < 20; ii++) {
    console.log(fibber.next());
}

如果我把*yield *createFib(b, b + a);行中去掉,事情就会中断,这是有道理的,因为我不想产生迭代器,而是想要一个实际值。

*在发电机中的技术意义是什么?

对于大多数情况,

yield *smth;

和一样

for (let x of smth) {
  yield x;
}

当在function声明中使用*时,这意味着它是一个生成器函数。

但当它被用作yield *myGeneratorFunction()时,Ecmascript 262规范第14.4.14节的定义称,引擎试图解析调用生成器函数返回的迭代器的next()方法的生成器函数。

当使用yield而不使用*时(例如,yield createFibonacci()),它会在yield之后返回表达式的值。示例中是createFibonacci的返回值。