Javascript 用函数理解ES6中的产量
因此,我理解生成器的概念以及JavaScript中的关键字“yield”代表了什么,但当我在Chrome(Mac OS X 10.10.3上的43.0.2357.81(64位)版本)中使用它时,我遇到了一种我不理解结果的情况 下面是一个关于收益率如何工作的工作示例:Javascript 用函数理解ES6中的产量,javascript,ecmascript-6,Javascript,Ecmascript 6,因此,我理解生成器的概念以及JavaScript中的关键字“yield”代表了什么,但当我在Chrome(Mac OS X 10.10.3上的43.0.2357.81(64位)版本)中使用它时,我遇到了一种我不理解结果的情况 下面是一个关于收益率如何工作的工作示例: 函数*test(){ var i=0; 而(i
函数*test(){
var i=0;
而(i<4){
收益率++指数;
}
}
测试仪=测试();
console.log(tester.next().value)//1.
console.log(tester.next().value)//2.
console.log(tester.next().value)//3.
console.log(tester.next().value)//4.
console.log(tester.next().value)//未定义
结果如我所料。按照中的示例,我发现您可以使用yield*来使用另一个生成器函数。在我的理解中,我希望将收益率与函数一起使用应该将该函数作为其值返回。以下是我的例子:
function* test() {
var i = 0;
while ( i < 4 ) {
++i;
yield function( a ) { return a + i; };
}
}
tester = test();
console.log( tester.next().value ); //undefined
console.log( tester.next().value ); //undefined
console.log( tester.next().value ); //undefined
console.log( tester.next().value ); //undefined
console.log( tester.next().value ); //undefined
函数*test(){
var i=0;
而(i<4){
++一,;
屈服函数(a){返回a+i;};
}
}
测试仪=测试();
console.log(tester.next().value)//未定义
console.log(tester.next().value)//未定义
console.log(tester.next().value)//未定义
console.log(tester.next().value)//未定义
console.log(tester.next().value)//未定义
有人能帮我理解为什么返回的值不是函数吗?我看了一下,但是在生成器规范中是否有我遗漏的东西,强制将值设置为原语?让您的代码工作。请随意重新粘贴和检查。记住在右上角的选项中打开“实验”
function* test() {
var i = 0;
while ( i < 4 ) {
++i;
yield function( a ) { return a + i; };
}
return "done"
}
let tester = test();
console.log( tester.next().value ); //fn
console.log( tester.next().value ); //fn
console.log( tester.next().value ); //fn
console.log( tester.next().value ); //fn
console.log( tester.next().value ); //string literal "done"
.initGeneratorFunction()
正在接受输入,但是test
在这样分配时不接受输入。所以它…似乎在默默地扔。看起来这只是一个传输程序,因为let
,只是声明它允许传输的代码有一个提升的变量
有更多ES6经验的人能确认这是评论中的错误吗?可能传输程序需要某种语法,或者这是严格模式的要求
摘要:
看起来您的理解很好,只是当前transpiler环境的一个怪癖。声明变量可能是一种很好的做法,TeamAwesome(即)说
const
是一个很好的选择 我不能复制这个。我看到函数匿名(a)
四次。你用的是什么版本的Chrome?这里也一样。在Chrome 43上为我工作时,我假设您看到的undefined
是对console.log
语句求值时返回的值。该函数是从生成器返回的:在第二个示例中,我还调用了函数dotester.next().value(1)
(这里也有chrome 43)。我在Mac OS上使用的是chrome 43.0.2357.81版(64位)X@Dario我还尝试记录从next()返回的整个对象调用时,返回的对象完全缺少值键/值。
function* test() {
var i = 0;
while ( i < 4 ) {
++i;
yield function( a ) { return a + i; };
}
return "done"
}
let tester = test();
console.log( tester.next().value ); //fn
console.log( tester.next().value ); //fn
console.log( tester.next().value ); //fn
console.log( tester.next().value ); //fn
console.log( tester.next().value ); //string literal "done"
$traceurRuntime.ModuleStore.getAnonymousModule(function() {
"use strict";
var $__0 = $traceurRuntime.initGeneratorFunction(test);
function test() {
var i;
return $traceurRuntime.createGeneratorInstance(function($ctx) {
while (true)
switch ($ctx.state) {
case 0:
i = 0;
$ctx.state = 11;
break;
case 11:
$ctx.state = (i < 4) ? 5 : 7;
break;
case 5:
++i;
$ctx.state = 6;
break;
case 6:
$ctx.state = 2;
return function(a) {
return a + i;
};
case 2:
$ctx.maybeThrow();
$ctx.state = 11;
break;
case 7:
$ctx.returnValue = "done";
$ctx.state = -2;
break;
default:
return $ctx.end();
}
}, $__0, this);
}
tester = test();
console.log(tester.next().value);
console.log(tester.next().value);
console.log(tester.next().value);
console.log(tester.next().value);
console.log(tester.next().value);
return {};
});
//# sourceURL=traceured.js