Generator.next()如何处理其参数?

时间:2016-05-20 19:26:33

标签: javascript ecmascript-6

documentation表示“您还可以为下一个向生成器发送值的方法提供参数。”它将它发送到哪里?

例如,拿这三个发电机:

function* one() {
  while(true) {
    var value = yield null;
  }
}
var g1 = one();  g1.next();
g1.next(1000); //yields null

function* two() {
  var i = 0;
  while (true) {
    i += yield i;
  }
}
var g2 = two(); g2.next(); 
g2.next(1000) // yields 1000

function* three(){
  var index = 0;
  while (true)
    yield index++;
}

 g3 = three();
 g3.next();
 g3.next(1000); // yields 1

在生成器3和1中,传递的参数对next没有影响。这是为什么?发电机2如何计算其返回值?为什么它会受到给定参数的影响?

1 个答案:

答案 0 :(得分:9)

理解这一点的关键是知道下一个函数如何检索传递给next()的参数,这是yield运算符的返回值:

[rv] = yield [expression];

与[expression]的值无关,yield将赋予rv传递给next()的值。

但是,这里有一个棘手的部分:yield只会在从前一次迭代恢复执行时分配传递给next()的值。因此,在第一次迭代中,yields不会将任何内容分配给rv。

例如,如果我有这个发生器:

function* gen() {
  // On the first iteration, yield does not return anything.
  //because it returns something ONLY when execution is resumed
  returnedFromYield = yield 'foo'; 
  yield returnedFromYield; 
}
第一次迭代时未定义

returnedFromYield。当在第二次迭代时恢复执行时,yield将传递的值赋给returnedFromYield变量,然后返回该变量:

g.next(1); // 'foo'
g.next(2); // 2

让我们回顾一下另一个例子:

function* gen() {
  yield yield yield 5;
}

在第一次迭代中,(g.next()),yield将返回5,在第二次迭代中,(g.next(10))yield将传递10到第二次yield。也就是说,第二次迭代中的yield yield yield 5;等同于yield yield 10;,并且在第三次迭代中,它等效于yield valuePassedToNext