javascript - 为什么第二个yield首先在这个生成器中返回

标签 javascript ecmascript-6 yield

在下面的代码中,为什么第一个调用next()返回第二个之后的值yield 关键字?

function* generatorFunction() {
  yield (yield 'the second yield')();
}

function func(x) {
  return 'func passed to the second next()';
}

var iterator = generatorFunction();

var firstValue = iterator.next().value;
var secondValue = iterator.next(func).value;

console.log(firstValue); // "the second yield"
console.log(secondValue); // "func passed to the second next()"

在第一个 next() 上,它将第一个 yield 之后的行的其余部分视为表达式,对吧?这是否意味着 (yield x)() 计算结果为 x,但在计算时实际上并没有在 yield 上暂停?

然后第二次调用 next 传入一个函数,该函数是否取代 (yield 'the secondary yield') 并执行然后返回它的值(value)。

谁能帮忙解释一下这是怎么回事吗?

顺便说一句,这没有任何实际目的,我只是浏览 es6katas .

最佳答案

这是一个很好的例子,但几乎不言自明。

表达式

yield (yield 'the second yield')();

根据operator precedence由内而外地评估.

首先,外部的右侧部分yield被评估,(yield 'the second yield')() .

左功能部分,(yield 'the second yield')首先评估小组。 'the second yield'值从第一个 next() 返回调用时,生成器暂停于内部 yield .

发电机在 next(func) 上恢复调用,yield 'the second yield'评估为发送值( func ),然后右函数部分 func()评估为 'func passed to the second next()' .

最后,外层的左边部分yield被评估,'func passed to the second next()'从第二个 next(func) 返回调用时,生成器已暂停。

关于javascript - 为什么第二个yield首先在这个生成器中返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38625597/

相关文章:

javascript - 如果长度未知, Handlebars 返回具有特定索引的数组元素

javascript - Angular4 - 如何使 CanDeactive 守卫使用 dialogService 确认与链接的可观察对象一起工作?

javascript - javascript不能返回 promise -返回的 promise 未执行

ruby-on-rails - find_in_batches "NO BLOCK GIVEN (YIELD)"

python 递归函数中的生成器

javascript - 如何随机选择三张图像,然后用新图像将它们淡出?

javascript - 来自 dangerouslySetInnerHTML 的完全相同的代码不能仅在 Gatsby/ReactJS 页面内工作

javascript - ES6 深度嵌套对象解构

reactjs - 从子组件调用时,父组件中的上下文丢失

java - 如果在同步方法中调用,thread.yield() 是否会失去对对象的锁定?