了解收益率如何影响JS生成器中的返回值

时间:2019-05-26 23:01:27

标签: javascript ecmascript-6 generator

假设我具有以下功能:

function *hello(x) { // define generator
  while (x < 7) {
	console.log(`before: ${x}`)
    x += yield x + 1; // generator object will have value x + 1, then next step of generator has value x + x and not x + x + 1
	console.log(`after: ${x}`)
  }
  return x; 
}
var world = hello(3);
console.log( world.next(2) ); 
console.log( world.next(2) ); 
console.log( world.next(2) );
console.log( world.next(2) );

// before: 3
// {value: 4, done: false}
// after: 5
// before: 5
// {value: 6, done: false}
// after: 7
// {value: 7, done: true}
// {value: undefined, done: true}

我看到带有yield的行返回了一个值为x + 1的生成器对象,但是x的实际值仅增加了x,而不是x+1,如beforeafter控制台日志中的值所示。为什么将x右侧的yield的值添加到x的当前值中,而+ 1却没有呢?我知道x的值是要添加的值,因为如果我更改了next函数中传递给生成器对象的值,则之前和之后的值将反映多少x增加了。

function *hello(x) { // define generator
  while (x < 7) {
	console.log(`before: ${x}`)
    x += yield x + 1; // generator object will have value x + 1, then next step of generator has value x + x and not x + x + 1
	console.log(`after: ${x}`)
  }
  return x; 
}
var world = hello(3);
console.log( world.next(1) ); 
console.log( world.next(1) ); 
console.log( world.next(1) );
console.log( world.next(1) );

// before: 3
// {value: 4, done: false}
// after: 4
// before: 4
// {value: 5, done: false}
// after: 5
// before: 5
// {value: 6, done: false}
// after: 6
// before: 6
// {value: 7, done: false}
// after: 7
// {value: 7, done: true}
// {value: undefined, done: true}

1 个答案:

答案 0 :(得分:3)

表达式的值:

x += yield x + 1;

不是 x + 1。值x + 1是产生给调用方的值。生成器中yield的值就是传递的值。在这种情况下,它始终为1,因为这是通过以下方式传递给它的:

world.next(1)

发电机一旦碰到yield,就会立即停止运行,因此在这种情况下

x += yield x + 1;

您可以认为它的工作方式如下:

yield x + 1; // pass this value to the called

[Pause]

[Next call from  world.next(1)]

x = 1 // value passed in from caller