Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“什么是”呢;功能*”;用JavaScript?_Javascript_Function_Ecmascript 6 - Fatal编程技术网

“什么是”呢;功能*”;用JavaScript?

“什么是”呢;功能*”;用JavaScript?,javascript,function,ecmascript-6,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];

在第页中,我发现了一个新的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;
    }
}
我已经知道,但不知道
函数*
是什么意思。这是什么

顺便说一句,不用麻烦尝试谷歌,它是用来搜索带有星号()的表达式。

这是一个函数

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

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


历史注释:

这是建议使用的
EcmaScript.next
语法

Mozilla的戴夫·赫尔曼(Dave Herman)做了一个关于。一开始,他谈论发电机

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

您可以在EcmaScript工作组wiki上找到更多详细信息:

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

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

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

例子 斐波那契数的“无限”序列(尽管在253左右):

生成器可以在循环中迭代:

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

函数*
类型看起来像是可以迭代的进程的生成器函数。 C#有这样一个特性,使用“收益率回报”和

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

这是一个-在您引用的页面中,在您替换为“this is the Interest line”的注释中这样说


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

后续:没有参数(
for(;;)
)的for循环做什么?为什么要在这个上下文中使用它?@Fergie,
for(;;)
while(true)
相同。因为斐波那契序列是一个无界序列,所以在本文中使用它。@DaveVandenEynde,现有技术:Python屈服。现有技术:CLU和图标。示例中的注释现在已经很旧了,
function*
语法从v26:*开始在Firefox中得到支持。旧版本使用了不同的语法。关于谷歌,只需搜索“函数星”或“函数星号”。我就是这样发现这个问题的;)。看起来
*
是从@Nickolay的链接中删除的。这里有一个链接。当然,“基本”支持。另一个MDN链接(顺便说一句,我在OP链接的MDN页面上找到了):另一个有用的MDN链接:““通过索引访问而不必计算整个序列”可能是迄今为止我遇到的关于生成器的最有帮助的解释。我可以看到在应用程序中使用它,而以前只是从理论上理解它。
let seq = fibonacci();
print(seq.next()); // 1
print(seq.next()); // 2
print(seq.next()); // 3
print(seq.next()); // 5
print(seq.next()); // 8