在下面的代码中,为什么第一个调用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/