什么是JavaScript中的“function *”?

时间:2012-03-08 15:53:07

标签: javascript function ecmascript-6

this页面中,我找到了一个新的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;
    }
}

我已经知道what yield, let and [?,?]=[?,?] do,但不知道function*是什么意思。它是什么?

P.S。不要费心去尝试谷歌,impossible搜索带星号的表达式(they're used as placeholders)。

3 个答案:

答案 0 :(得分:182)

这是Generator功能。

  

生成器是可以退出并稍后重新输入的功能。他们的上下文(变量绑定)将在重新入口处保存。

     

调用生成器函数不会立即执行其正文;而是返回该函数的迭代器对象。当调用迭代器的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=harmony:generators

工作组(TC-39)普遍同意EcmaScript.next应该有某种生成器迭代器提议,但这不是最终的。

你不应该依赖这种显示而不改变下一版本的语言,即使它没有改变,它也可能暂时不会在其他浏览器中出现。

  

概述

     

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

     

实施例

     

Fibonacci数的“无限”序列(尽管行为大约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

答案 1 :(得分:49)

这是一个generator function - 它在您引用的页面中这样说,在您用“这是有趣的行”替换的评论中......

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

答案 2 :(得分:11)

function*类型看起来像是可以迭代的进程的生成器函数。 C#使用“yield return”see 1see 2

这样的功能

本质上,这会逐个返回每个值到迭代此函数的任何值,这就是为什么它们的用例在foreach样式循环中显示它。