在这个页面中,我发现了一个新的 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; } }
我已经知道什么yield,let做[?,?]=[?,?]什么,但不知道它function*是什么意思。它是什么?
yield
let
[?,?]=[?,?]
function*
PS不要费心尝试谷歌,不可能搜索带星号的表达式(它们被用作占位符)。
这是一个生成器函数。
生成器是可以退出并稍后重新进入的功能。它们的上下文(变量绑定)将在重新进入时保存。 调用生成器函数不会立即执行其主体;而是返回该函数的迭代器对象。当迭代器的next()方法被调用时,生成器函数的主体被执行,直到第一个yield表达式,它指定从迭代器返回的值,或者yield*委托给另一个生成器函数。
生成器是可以退出并稍后重新进入的功能。它们的上下文(变量绑定)将在重新进入时保存。
调用生成器函数不会立即执行其主体;而是返回该函数的迭代器对象。当迭代器的next()方法被调用时,生成器函数的主体被执行,直到第一个yield表达式,它指定从迭代器返回的值,或者yield*委托给另一个生成器函数。
next()
yield*
历史注释:
这是EcmaScript.next.
EcmaScript.next
Mozilla 的 Dave Herman 发表了关于EcmaScript.next的演讲。在30:15,他谈到了发电机。
早些时候,他解释了 Mozilla 如何实验性地实施提议的语言更改以帮助指导委员会。Dave 与 Mozilla 的 CTO(我认为)和最初的 JavaScript 设计师 Brendan Eich 密切合作。
您可以在 EcmaScript 工作组 wiki 上找到更多详细信息:http ://wiki.ecmascript.org/doku.php?id=harmony:generators
工作组 (TC-39) 普遍同意 EcmaScript.next 应该有某种生成器迭代器提案,但这不是最终的。
你不应该依赖它在下一个版本的语言中没有变化,即使它没有变化,它也可能暂时不会在其他浏览器中广泛出现。
概述 一流的协程,表示为封装暂停执行上下文(即函数激活)的对象。现有技术:Python、Icon、Lua、Scheme、Smalltalk。 例子 斐波那契数列的“无限”序列(尽管行为在 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
一流的协程,表示为封装暂停执行上下文(即函数激活)的对象。现有技术:Python、Icon、Lua、Scheme、Smalltalk。
斐波那契数列的“无限”序列(尽管行为在 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