Что означает синтаксис * (звездочка / звездочка) после выхода в функции рекурсивного генератора?
Допустим, я создал генератор 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.