在递归生成函数中,收益后的*(星号/星号)语法是什么意思?

时间:2016-05-15 14:31:10

标签: javascript iterator ecmascript-6 generator yield

我们说我已经创建了一个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);行中移开,这是有道理的,因为我不想要收益率是迭代器而是实际价值。

生成器中*的技术含义是什么?

2 个答案:

答案 0 :(得分:2)

对于大多数情况

yield *smth;

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

答案 1 :(得分:2)

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

但当它用作yield *myGeneratorFunction()时,Ecmascript 262 specification, Section 14.4.14的定义表示引擎试图解析生成器函数调用生成器函数返回的迭代器的next()方法。

如果在没有yield的情况下使用*(例如,yield createFibonacci()),则会在yield之后返回表达式的值。在示例中是createFibonacci返回的值。