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; } }
我已经知道什么yield
, let
和[?,?]=[?,?]
做 ,但不知道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样式循环中显示它。