【问题标题】:Why does the second yield return first in this generator为什么第二个 yield 在这个生成器中首先返回
【发布时间】:2016-12-02 05:02:33
【问题描述】:

在下面的代码中,为什么 first 调用 next() 会返回 second 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,但在计算结果时实际上并没有暂停产量?

然后对next 的第二次调用传入一个函数,该函数是否代替(yield 'the second yield') 并因此被执行然后返回其值。

谁能帮忙解释一下这里发生了什么?

顺便说一句,这没有实际用途,我只是通过es6katas

【问题讨论】:

  • 同意@estus 的补充:如果第一个yield 先返回,它会返回什么?
  • 我想我的字面意思是“在第一次收益时停止”。 (我对它实际上会返回什么感到困惑。)所以它按照计算 yield 表达式的顺序产生,就像 returns 一样。很有道理,谢谢大家。 @estus 随时将其复制到答案中。
  • 当然。我用运算符优先级解释对其进行了扩充,而不是诉诸“语言感”。

标签: javascript ecmascript-6 yield


【解决方案1】:

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

表达式

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) 调用返回,生成器暂停。

【讨论】:

    猜你喜欢
    • 2018-12-13
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2016-08-19
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多