Что означает синтаксис * (звездочка / звездочка) после выхода в функции рекурсивного генератора?

Допустим, я создал генератор 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 ответа

Для большинства случаев

yield *smth;

делает то же самое, что и

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

Когда * используется в function Декларация это означает, что это функция генератора.

Но когда он используется как yield *myGeneratorFunction()определение спецификации Ecmascript 262, раздел 14.4.14, говорит, что механизм пытается разрешить функцию генератора, вызывающую next() метод итератора, возвращаемый функцией генератора.

Когда yield используется без * (например, yield createFibonacci()), возвращает значение выражения после yield. В этом примере возвращено значение createFibonacci.

Другие вопросы по тегам