Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript生成器中收益返回值的解析_Javascript_Generator_Ecmascript 6 - Fatal编程技术网

JavaScript生成器中收益返回值的解析

JavaScript生成器中收益返回值的解析,javascript,generator,ecmascript-6,Javascript,Generator,Ecmascript 6,如果我向生成器上的next方法提供一个值,除了在yield关键字的右侧提供一个表达式外,yield的返回值是如何解析的 function* go() { console.log(yield 'a'); console.log(yield 'b'); } var g = go(); g.next(); g.next('one'); g.next('two'); 输出: one two Object {value: undefined, done: true} 根据输出,提供给下一个方

如果我向生成器上的
next
方法提供一个值,除了在
yield
关键字的右侧提供一个表达式外,
yield
的返回值是如何解析的

function* go() {
  console.log(yield 'a');
  console.log(yield 'b');
}

var g = go();
g.next();
g.next('one');
g.next('two');
输出:

one
two
Object {value: undefined, done: true}
根据输出,提供给下一个方法的值将覆盖
yield
右侧表达式返回的值


编辑:更新代码以更好地反映我的问题。

有两种方法可以解释“收益率的返回值”

您可以表示表达式的值
产生“a”
。从输出中可以看到,它的值为1

或者您可以表示传递给
yield
的值,该值实际上是从生成器的
next
方法“返回”的。您的代码片段并没有真正揭示这一点。尝试:

console.log('next1', g.next());
console.log('next2', g.next('one'));
console.log('next3', g.next('two'));
通过这种方式,您可以看到从生成器中输出的值,这些值应该类似于:

"next1", {value: "a", done: false}
"next2", {value: "b", done: false}
"next3", {value: undefined, done: true}
您可以做的另一件事是在生成器函数的末尾添加一个普通的
返回值,这将是
next3的

根据输出,提供给下一个方法的值将覆盖由yield右边的表达式返回的值

提供给
next
方法的值不会“使用”在
yield
右侧的值之上。提供给
next
的值是
yield
表达式的最终计算结果。总是。
产量右侧的值是提供给发电机耗电元件的值

function* go() {
  console.log(yield 'a');   // 'one'
  console.log(yield 'b');   // 'two'
}

var g = go();
console.log(g.next());       // { value: 'a', done: false }       
console.log(g.next('one'));  // { value: 'b', done: false }
console.log(g.next('two'));  // { value: undefined, done: true }
它是生成器和使用生成器的代码之间的双向通信

function* go() {
  console.log(yield 'a');   // 'one'
  console.log(yield 'b');   // 'two'
}

var g = go();
console.log(g.next());       // { value: 'a', done: false }       
console.log(g.next('one'));  // { value: 'b', done: false }
console.log(g.next('two'));  // { value: undefined, done: true }

“已解决”是什么意思?请注意,您可以将示例简化为
function*go(){console.log(yield'a');}
似乎
yield
返回的值之间存在冲突-或者是作为参数传递给
next
,或
yield
关键字右侧表达式返回的值。确定收益率“返回”哪一个的规则是什么。除了像
g.next(g.next().value)
+1那样驱动,右边的值永远不会从
yield
表达式返回,以指出它是生成器和使用生成器的代码之间的双向通信。我猜MDN提供的关于
rv
的信息有点误导,因为“表达式的值”可能指的是收益率右侧的表达式。