JavaScript 中的“function*”是什么?

2022-08-30 00:30:55

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

我已经知道产量是多少,[?,?]=[?,?]确实如此,但不知道这意味着什么。这是什么?function*

附言:不要费心尝试Google,不可能搜索带有星号的表达式它们被用作占位符)。


答案 1

这是一个生成器函数。

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

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


历史注释:

这是 建议的语法。EcmaScript.next

Mozilla 的 Dave Herman 做了一个关于 EcmaScript.next 的演讲在30:15,他谈到了发电机。

早些时候,他解释了Mozilla如何实验性地实施拟议的语言更改,以帮助指导委员会。Dave 与 Mozilla 的首席技术官 Brendan Eich(我认为)以及最初的 JavaScript 设计师密切合作。

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

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

你不应该依赖于在下一个版本的语言中没有变化就显示出来,即使它没有改变,它也可能在一段时间内不会在其他浏览器中广泛显示。

概述

一等协程,表示为封装挂起的执行上下文(即函数激活)的对象。现有技术: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

答案 2

这是一个生成器函数 - 它在你引用的页面中是这样说的,在你用“这是有趣的行”替换的评论中......

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