Понимание того, как доход влияет на возвращаемое значение в генераторе JS - PullRequest
3 голосов
/ 27 мая 2019

Допустим, у меня есть какая-то функция следующим образом:

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, что видно по значениям в журналах консоли before и after.Почему значение 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 Ответ

3 голосов
/ 27 мая 2019

Значение выражения:

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
...