这是一个Generator函数。
生成器函数可以被退出并稍后重新进入。它们的上下文(变量绑定)将在重新进入时保存。
调用生成器函数不会立即执行其主体;而是返回该函数的迭代器对象。当调用迭代器的 next()
方法时,生成器函数的主体将被执行,直到第一个 yield
表达式,该表达式指定要从迭代器返回的值,或者使用 yield*
将控制权委托给另一个生成器函数。
历史注释:
这是一个提议的语法,用于 EcmaScript.next
。
Mozilla 的 Dave Herman 发表了一篇关于 EcmaScript.next 的演讲。在 30:15 他谈到了生成器。
早些时候,他解释了 Mozilla 正在实验性地实现提议的语言更改以帮助指导委员会。Dave 与 Brendan Eich 密切合作,后者是 Mozilla 的 CTO(我想),也是最初的 JavaScript 设计师。
您可以在 EcmaScript 工作组维基上找到更多详细信息:http://wiki.ecmascript.org/doku.php?id=harmony:generators
工作组(TC-39)普遍认为,EcmaScript.next 应该有某种生成器迭代器提案,但这还没有最终确定。
您不应该指望在语言的下一个版本中不做任何改变地看到这个,即使没有改变,其他浏览器也可能一段时间内不会广泛支持。
Overview
First-class coroutines, represented as objects encapsulating suspended execution contexts (i.e., function activations). Prior art: Python, Icon, Lua, Scheme, Smalltalk.
Examples
The “infinite” sequence of Fibonacci numbers (notwithstanding behavior around 253):
function* fibonacci() {
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
Generators can be iterated over in loops:
for (n of fibonacci()) {
if (n > 1000)
break;
print(n);
}
Generators are iterators:
let seq = fibonacci();
print(seq.next());
print(seq.next());
print(seq.next());
print(seq.next());
print(seq.next());
function*
语法:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function* 。旧版本使用不同的语法。 - Nickolay*
被去掉了。这里是一个指向MDN上function*
的链接(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*)。确实,自v26以来有“基本”支持(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*#Browser_compatibility)。 - ruffin