在this页面中,我找到了一个新的JavaScript函数类型:
// 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;
}
}
我已经知道what yield
, let
and [?,?]=[?,?]
do,但不知道function*
是什么意思。它是什么?
P.S。不要费心去尝试谷歌,impossible搜索带星号的表达式(they're used as placeholders)。
答案 0 :(得分:182)
这是Generator功能。
生成器是可以退出并稍后重新输入的功能。他们的上下文(变量绑定)将在重新入口处保存。
调用生成器函数不会立即执行其正文;而是返回该函数的迭代器对象。当调用迭代器的
next()
方法时,执行生成器函数的主体直到第一个yield
表达式,该表达式指定从迭代器返回的值,或者使用yield*
委托给另一个发电机功能。
历史记录:
这是EcmaScript.next
的建议语法。
Mozilla的Dave Herman谈到EcmaScript.next。在30:15,他谈到了发电机。
之前,他解释了Mozilla如何通过实验实施提议的语言变更来帮助指导委员会。 Dave与Mozilla的首席技术官(我认为)和最初的JavaScript设计师Brendan Eich密切合作。
您可以在EcmaScript工作组wiki上找到更多详细信息:http://wiki.ecmascript.org/doku.php?id=harmony:generators
工作组(TC-39)普遍同意EcmaScript.next应该有某种生成器迭代器提议,但这不是最终的。
你不应该依赖这种显示而不改变下一版本的语言,即使它没有改变,它也可能暂时不会在其他浏览器中出现。
概述
第一类协程,表示为封装挂起的执行上下文的对象(即函数激活)。现有技术:Python,Icon,Lua,Scheme,Smalltalk。
实施例
Fibonacci数的“无限”序列(尽管行为大约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
答案 1 :(得分:49)
这是一个generator function - 它在您引用的页面中这样说,在您用“这是有趣的行”替换的评论中......
基本上,这是一种以编程方式指定序列的方法,以便可以传递它们并通过索引访问元素,而无需事先计算整个序列(可能是无限大小)。
答案 2 :(得分:11)