str*_*QNA 239 javascript function ecmascript-6
在这个页面中,我找到了一个新的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;
}
}
Run Code Online (Sandbox Code Playgroud)
我已经知道了什么yield
,let
以及[?,?]=[?,?]
做的,但不知道什么function*
是注定的.它是什么?
Mik*_*uel 193
这是一个发电机功能.
生成器是可以退出并稍后重新输入的功能.他们的上下文(变量绑定)将在重新入口处保存.
调用生成器函数不会立即执行其正文; 而是返回该函数的迭代器对象.当
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 = eth:generator
工作组(TC-39)普遍同意EcmaScript.next应该有某种生成器迭代器提议,但这不是最终的.
你不应该依赖于这种显示而不改变下一版本的语言,即使它没有改变,它也可能暂时不会在其他浏览器中出现.
概观
第一类协同程序,表示为封装挂起的执行上下文(即函数激活)的对象.现有技术:Python,Icon,Lua,Scheme,Smalltalk.
例子
Fibonacci数的"无限"序列(尽管行为约为2 53):
Run Code Online (Sandbox Code Playgroud)function* fibonacci() { let [prev, curr] = [0, 1]; for (;;) { [prev, curr] = [curr, prev + curr]; yield curr; } }
生成器可以在循环中迭代:
Run Code Online (Sandbox Code Playgroud)for (n of fibonacci()) { // truncate the sequence at 1000 if (n > 1000) break; print(n); }
生成器是迭代器:
Run Code Online (Sandbox Code Playgroud)let seq = fibonacci(); print(seq.next()); // 1 print(seq.next()); // 2 print(seq.next()); // 3 print(seq.next()); // 5 print(seq.next()); // 8