为什么javascript生成器函数的yield语句返回.next()的参数?

jak*_*zon 6 javascript yield

我在MDN上偶然发现了生成器函数,让我感到困惑的是以下示例:

function* logGenerator() {
  console.log(yield);
  console.log(yield);
  console.log(yield);
}

var gen = logGenerator();

// the first call of next executes from the start of the function
// until the first yield statement
gen.next(); 
gen.next('pretzel'); // pretzel
gen.next('california'); // california
gen.next('mayonnaise'); // mayonnaise
Run Code Online (Sandbox Code Playgroud)

我不明白的是为什么作为yield参数的语句console.log返回传递给.next()生成器方法的参数.这是否发生是因为空yield必须返回.next()方法的第一个参数的值?

我还尝试了一些例子,似乎证实了上述陈述:

gen.next(1,2,3); // the printed value is 1, the 2 and 3 are ignored
// and the actual yielded value is undefined
Run Code Online (Sandbox Code Playgroud)

还有一种方法可以访问.next()生成器函数体内的方法的其他参数吗?

我注意到的另一件事是,当yield语句将这些值返回到console.log它们时,它们实际上不会作为生成器的输出而产生.我必须说我觉得很困惑.

小智 4

很好的问题。我认为阅读 MDN 上关于该.next()方法的内容是最有帮助的。您可以在生成器函数本身(即)中定义要传递的值,或者通过以下方式yield 1传递值:next()gen.next(1)

该next()方法本身返回一个对象,其中包含属性value和一个布尔值done,该布尔值表示生成器函数是否完整(即耗尽可用输出,现在仅输出undefined一个值)。

也就是说,有两种方法可以访问/传递它value。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator/next