2016-05-15 75 views
3

比方说,我创建了一个ES6发电机递归生成器函数中的yield(平均值)后的*(星号/星号)语法是什么?

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()'计算的结果,因为它证明了生成器对象的迭代结束值'return'。它也不能正确表示当发电机的用户投入发电机时会发生什么,等等。 – 2016-05-15 17:24:03

+1

@torazaburo,你能举个例子吗? – Qwertiy

2

*function声明使用此意味着它是一台发电机的功能。

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

使用yield而不使用*(例如,yield createFibonacci())时,它会在yield之后返回表达式的值。在这个例子中是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()'函数的生成器函数返回**的可迭代**。 – 2016-05-15 17:13:18