При вызове функции генератора создается и возвращается объект итератора (в вашем примере кода, на который ссылается "gen_").Код функции генератора не выполняется.
Этот объект итератора используется для управления функцией генератора и поддерживает контекст выполнения функции генератора.Объект итератора предоставляет свойство [[GeneratorLocation]], которое, как я предполагаю, отслеживает, где выполнение программы приостановлено.
Посредством этой ссылки объекта итератора на контекст генератора данные генератора сохраняются, тогда как обычно после завершения выполнения программы нормальной функции эти данные отбрасываются через сборщик мусора (поскольку ничто не будет указыватьк нему).
После вашего первого вызова .next () вашего итератора генератор выполняет код, пока не достигнет оператора yield.Затем он возвращает новый объект с (в вашем примере кода) {value: 1, done: false}.Поскольку для параметра done задано значение false, объект итератора знает, что работа еще не завершена, поэтому данные генератора сохраняются.
Когда выполнение программы ставится на паузу, генератор не блокируется, удаляя контекст выполнения генератора из стека вызовов.Однако он не отбрасывается, потому что ссылка объекта итератора на контекст генератора сохраняет данные генератора живыми.
При вызове .next () для итератора происходит следующее: контекст выполнения функции генератора сновапомещается на вершину стека вызовов, продолжая выполнение там, где оно было прервано, до тех пор, пока не достигнет больше операторов yield, возвращая объект с {value: undefined, done: true}.Теперь объект итератора больше не будет указывать на генератор, а функция генератора будет удалена из памяти.