在此页面中,我找到了新的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*
这是一个生成器功能。
生成器是可以退出并稍后重新输入的函数。它们的上下文(变量绑定)将在重新进入时保存。 调用生成器函数不会立即执行其主体。而是返回该函数的迭代器对象。next()调用迭代器的方法时,将执行生成器函数的主体,直到第一个yield表达式指定要从迭代器返回的值,或者使用yield*,将其委托给另一个生成器函数。
生成器是可以退出并稍后重新输入的函数。它们的上下文(变量绑定)将在重新进入时保存。
调用生成器函数不会立即执行其主体。而是返回该函数的迭代器对象。next()调用迭代器的方法时,将执行生成器函数的主体,直到第一个yield表达式指定要从迭代器返回的值,或者使用yield*,将其委托给另一个生成器函数。
next()
yield*
历史记录:
这是的建议语法EcmaScript.next。
EcmaScript.next
Mozilla的Dave Herman谈到了EcmaScript.next。在30:15他谈到了发电机。
之前,他解释了Mozilla如何通过实验方式实施建议的语言更改以帮助指导委员会。Dave与Mozilla的CTO(我认为)和原始JavaScript设计师BrendanEich紧密合作。
工作组(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