【问题标题】:ES6 generator: why the argument passed to the first next() function doesn't work? [duplicate]ES6 生成器:为什么传递给第一个 next() 函数的参数不起作用? [复制]
【发布时间】:2018-01-14 23:56:06
【问题描述】:

这是我的示例代码:

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,不应该是传入的参数值吗?

【问题讨论】:

  • 你什么都没有,那么你为什么期望得到这个论点呢?

标签: javascript ecmascript-6 generator


【解决方案1】:

这是生成器中发生的事情。

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

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

现在,第一个 .next 呼叫中当前暂停的 yield 是什么?没有,我们从函数顶部开始执行。

因此,无论您将什么传递给第一个 next 调用(它只是被忽略),第一个值都是 undefined

yield-ed 的值为undefined 而言,您将得到yield 的值。

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

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

【讨论】:

  • TIL for (const v of g()),我没想到你能做到!事后看来,这才是重点。
猜你喜欢
  • 2017-10-30
  • 2021-01-11
  • 1970-01-01
  • 2014-01-25
  • 2015-04-28
  • 1970-01-01
  • 2017-01-25
  • 2021-05-29
  • 2019-10-19
相关资源
最近更新 更多