JavaScript中的“function *”是什么?

在这个页面中,我发现了一个新的JavaScript函数types:

// NOTE: "function*" is not supported yet in Firefox. // Remove the asterisk in order for this code to work in Firefox 13 function* fibonacci() { // !!! this is the interesting line !!! let [prev, curr] = [0, 1]; for (;;) { [prev, curr] = [curr, prev + curr]; yield curr; } } 

我已经知道什么yieldlet[?,?]=[?,?]做 ,但不知道function*是什么意思。 它是什么?

PS不用费心尝试Google,用星号( 它们用作占位符 )searchexpression式是不可能的 。

这是EcmaScript.next的build议语法。

Mozilla的戴夫·赫尔曼(Dave Herman)对EcmaScript.next进行了一番讨论。 他在30:15谈到发电机。

此前,他解释了Mozilla是如何通过实验性地实现语言改变来帮助指导委员会的。 Dave与Mozilla的首席技术官Brendan Eich(我认为)和最初的JavaScriptdevise人员密切合作。

您可以在EcmaScript工作组wiki上find更多详细信息: http ://wiki.ecmascript.org/doku.php?id=harmony:generators

工作组(TC-39)普遍认为EcmaScript.next应该有某种生成器迭代器提议,但这不是最终的。

你不应该依赖这个显示出来的语言的下一个版本没有改变,即使它没有改变,它可能不会在其他浏览器广泛显示一段时间。

概观

第一类协程,表示为封装暂停执行上下文(即,函数激活)的对象。 现有技术:Python,Icon,Lua,Scheme,Smalltalk。

例子

斐波纳契数的“无限”序列(尽pipe行为在2 53左右):

 function* fibonacci() { let [prev, curr] = [0, 1]; for (;;) { [prev, curr] = [curr, prev + curr]; yield curr; } } 

生成器可以循环迭代:

 for (n of fibonacci()) { // truncate the sequence at 1000 if (n > 1000) break; print(n); } 

生成器是迭代器:

 let seq = fibonacci(); print(seq.next()); // 1 print(seq.next()); // 2 print(seq.next()); // 3 print(seq.next()); // 5 print(seq.next()); // 8 

这是一个生成器函数 – 它在你引用的页面中这样说,在你replace为“这是有趣的线”的评论…

基本上,这是一种以编程方式指定序列的方式,以便它们可以在索引中传递,并且可以通过索引访问元素,而无需事先计算整个序列(可能无限大)。

function*types看起来像它可以迭代进程的生成器函数。 C#有一个像这样的function使用“收益率” 见1 , 见2

从本质上讲,它将每个值逐一返回到迭代此函数的任何值,这就是为什么他们的用例在foreach样式循环中显示它。