ES6生成器:为什么传递给第一个next()函数的参数不起作用?

时间:2017-08-07 15:47:56

标签: javascript ecmascript-6 generator

以下是我的示例代码:

function *g() {
  while (true) {
    console.log(yield)
  }
}

var gen = g();
gen.next(3); // {value: undefined, done:false}
gen.next(3); // 3 {value: undefined, done:false}
gen.next(3); // 3 {value: undefined, done:false}

为什么传递给第一个next()函数的第一个参数不起作用?为什么value属性的值是undefined,它不应该是传入的参数值吗?

1 个答案:

答案 0 :(得分:2)

这是发电机中发生的事情。

第一次调用初始化生成器(并返回迭代器),不运行任何内部代码。

从那时起,迭代器上对.next(value)的每次调用都会传递从当前暂停的value返回的yield并继续执行到下一个yield(或函数结束),返回yield - ed(或返回)值。

现在,第一个yield来电时暂停的.next是什么?没有一个,我们从函数的顶部开始执行。

因此,无论您在第一次undefined调用中传递什么,它的第一个值都是next

至于yield - ed值为undefined,您得到的是yield

function *g() {
  yield;     // yields undefined
  yield 3;
  yield 'a';
}

for (const v of g()) {
  console.log(v);
}