我试图了解这是多么有效。我已经完全操纵了这个代码,但仍然不了解它是如何返回它的值。我从http://davidwalsh.name/es6-generators
的教程中得到了这个function *foo(x) {
var y = 2 * (yield (x + 1));
var z = yield (y / 3);
return (x + y + z);
}
var it = foo( 5 );
// note: not sending anything into `next()` here
console.log( it.next() ); // { value:6, done:false }
console.log( it.next( 12 ) ); // { value:8, done:false }
console.log( it.next( 13 ) ); // { value:42, done:true }
我似乎对第一个下一个()有一定的把握,但接下来的两个让我感到困惑的是8和42的值。
希望有人可以帮助解释这一点,以便我可以尝试掌握并使用发电机进入下一阶段。
答案 0 :(得分:5)
生成器不仅仅是闭包的语法糖,试试这个:
function foo(x)
{
var step = 0;
var y;
var z;
function next(p) {
switch( step++ ) {
case 0: return { done:false, value:x + 1 }; break;
case 1: y = 2 * p; return { done:false, value:y / 3 }; break;
case 2: z = p; return { done:true, value: x + y + z }; break;
default: return;
}
}
return {next:next};
}
var it = foo( 5 );
console.log( it.next() ); // { value:6, done:false }
console.log( it.next( 12 ) ); // { value:8, done:false }
console.log( it.next( 13 ) ); // { value:42, done:true }
答案 1 :(得分:2)
next
的参数成为前一个yield
的值。这是流程:
it.next()
启动生成器。其值为x + 1
,即6
。
it.next(12)
恢复生成器,返回12
作为yield (x + 1)
的值。 y
变为2 * 12
,即24
。 it.next(12)
的值为24 / 3
,即8
。
it.next(13)
恢复生成器,返回13
作为yield (y / 3)
的值,因此13
被分配给z
。因此,最终结果为5 + 24 + 13
或42
。
TL; DR: next
恢复生成器并传递值yield
返回。 yield
停止生成器并传递值next
返回。这就像这个有趣的数字网球比赛。