ES6发电机令人困惑

时间:2014-11-21 05:03:24

标签: javascript generator ecmascript-6

我试图了解这是多么有效。我已经完全操纵了这个代码,但仍然不了解它是如何返回它的值。我从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的值。

希望有人可以帮助解释这一点,以便我可以尝试掌握并使用发电机进入下一阶段。

2 个答案:

答案 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,即24it.next(12)的值为24 / 3,即8

it.next(13)恢复生成器,返回13作为yield (y / 3)的值,因此13被分配给z。因此,最终结果为5 + 24 + 1342

TL; DR: next恢复生成器并传递值yield返回。 yield停止生成器并传递值next返回。这就像这个有趣的数字网球比赛。