什么是“功能”?在JavaScript中?

页面,我发现了一个新的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;
}
}

我已经知道__ABC0, __ABC1和[?,?]=[?,?]做什么,但不知道function*是什么意思。是什么?

附注:不要尝试谷歌,它是不可能的来搜索带有星号的表达式(它们被用作占位符)。

50223 次浏览

它是一个发电机函数。

生成器是可以退出和稍后重新输入的函数。它们的上下文(变量绑定)将在重新进入时保存。

调用生成器函数不会立即执行它的主体;返回函数的迭代器对象。当迭代器的next()方法被调用时,生成器函数体将一直执行到第一个yield表达式,该表达式指定从迭代器返回的值,或者使用yield*将委托给另一个生成器函数。


历史的注意:

它是EcmaScript.next的建议语法。

Mozilla的Dave Herman做了一个关于EcmaScript.next的演讲。在30:15中,他谈到了生成器。

早些时候,他解释了Mozilla是如何实验性地实现提议的语言变化,以帮助指导委员会。Dave与Brendan Eich密切合作,Brendan Eich是Mozilla的CTO(我认为),也是最初的JavaScript设计者。

你可以在EcmaScript工作组wiki上找到更多细节:http://wiki.ecmascript.org/doku.php?id=harmony:generators

工作组(TC-39)普遍同意EcmaScript。接下来应该有一些生成器迭代器的建议,但这不是最终的。

你不应该指望下一个版本的语言没有变化就会出现这种情况,即使它没有变化,也可能暂时不会在其他浏览器中广泛出现。

概述

一级协程,表示为封装挂起执行上下文(即函数激活)的对象。现有技术:Python, Icon, Lua, Scheme, Smalltalk。

例子

斐波那契数列的“无限”序列(尽管行为在253附近):

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
function*类型看起来像是可以迭代的进程的生成器函数。 c#有一个这样的特性,使用"yield return" 看到1看到2

本质上,这将一个接一个地将每个值返回给迭代该函数的对象,这就是为什么他们的用例在foreach样式循环中显示它的原因。

它是生成器函数 -在你引用的页面中,在你替换为“这是有趣的一行”的注释中,它是这样说的……

基本上,它是一种以编程方式指定序列的方法,这样它们就可以传递,并且可以通过索引访问元素,而不必事先计算整个序列(可能是无限大的)。

函数 *

调用生成器函数不会立即执行它的主体;返回函数的迭代器对象。当迭代器的next()方法被调用时,生成器函数的主体将被执行,直到第一个yield表达式(它指定从迭代器返回的值)或使用yield*委托给另一个生成器函数。next()方法返回一个对象,该对象具有一个value属性,其中包含产生的值和一个done属性,该属性指示生成器是否产生了最后一个布尔值。使用参数调用next()方法将恢复生成器函数的执行,用next()的参数替换暂停执行的yield表达式。 文档:中数 < / p >

function* generator(i) {
yield i;
yield i + 10;
}


const gen = generator(10);


console.log(gen.next().value);
// expected output: 10


console.log(gen.next().value);
// expected output: 20