2016-05-15 2 views
3

Допустим, я создал генератор 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); линии вещи ломаются, которые имеет смысл, потому что я не хочу получать итератор, но фактическое значение.

Каково техническое значение * в генераторе?

+3

'yield *' делегат другому генератору. – Pointy

+0

может быть результатом * сплющить значения и сгладить их в функции генератора * лениво. – YOU

ответ

0
yield *smth; 

делает то же самое, как

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

Это упрощенная версия, но она не может решить, что оценивает 'yield * generator()', что, как оказалось, - это значение конца возврата, возвращаемое объектом-генератором. Это также неправильно отражает то, что происходит, когда потребитель генератора бросает в генератор и т. Д. –

+1

@torazaburo, не могли бы вы показать пример? – Qwertiy

2

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

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

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

+0

Онлайн-спецификация: http://www.ecma-international.org/ecma-262/6.0/#sec-14.4.14 – Oriol

+0

Да, это лучше. Спасибо –

+1

Это немного смущает. Вы говорите * следующее значение итератора - это возвращаемое значение функции *, но 'yield' не является функцией. Это ключевое слово, которое приводит к значению. Вы говорите: «движок пытается разрешить ...», но на самом деле происходит то, что «myGeneratorFunction» вызывается как ожидалось, возвращая итерабельность, и «yield *» работает над этим, как и любой другой итерабельный (например, '[ 1, 2] ', например). Функция генератора не имеет метода 'next()'; это итерируемый ** возвращенный ** функцией генератора, которая имеет функцию 'next()'. –

Смежные вопросы