所以我理解了生成器的概念以及关键字'产生的概念。代表在JavaScript中,但我在Chrome(Mac OS X 10.10.3版本43.0.2357.81(64位))中使用它,我遇到了一个我不会遇到的情况了解结果。
以下是收益率如何运作的工作示例:
function* test() {
var i = 0;
while ( i < 4 ) {
yield ++index;
}
}
tester = test();
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 ); //undefined
结果如我所料。按照MDN Documentation中的示例,我看到您可以使用yield *来使用另一个生成器函数。在我的理解中,我希望使用带函数的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
任何人都可以帮助我理解为什么返回的值不是函数吗?我看了但是在生成器规范中有什么我错过了强制值是原始的吗?
答案 0 :(得分:0)
让您的代码在Traceur中运行。随意重新粘贴和检查。记得转向实验&#39;位于右上角的选项中。
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"
只有后果:在记录之前用tester
或let
声明var
。
我猜这里,但它看起来像是一个错误的运输工具? 没有关键字的分配应该可以正常工作,我不相信ECMA6在这里引入了任何限制。它会打破太多。
以下是已编译的代码:
$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
.initGeneratorFunction()
正在接受输入,但test
不是hoisted。所以它突然出现......似乎无声无息。看起来这只是一个转换器,因为let
isn't actually supposed to hoist,只是声明它允许转换后的代码有一个提升变量。
具有更多ES6经验的人可以确认这是否是评论中的错误?也许转录程序期望某种语法,或者这是严格模式的要求?
摘要:
看起来你的理解很好,只是当前浏览器环境的一个怪癖。声明你的变量可能是一种好习惯,Team Awesome(即AirBnB)说const
是个不错的选择!