В ES6, как «генератор» фактически останавливается в двигателе V8? - PullRequest
0 голосов
/ 27 мая 2018

В ES6 появилась новая концепция под названием «Генератор».Он предоставляет метод для итерации чего-либо и паузы, пока потребитель не запросит следующие данные.

function *gen() {
  yield 1;
  yield 2;
  yield 3;
}

const gen_ = gen() 
gen_.next() // return 1

После gen_.next () он приостанавливается до тех пор, пока потребитель gen_ не запросит следующие данные '2'.Тогда, где хранятся данные внутри генератора?

Резюме)

Что на самом деле происходит внутри двигателя V8?Как можно приостановить его, пока потребитель не запросит следующие данные?и где находятся следующие данные?

1 Ответ

0 голосов
/ 27 мая 2018

При вызове функции генератора создается и возвращается объект итератора (в вашем примере кода, на который ссылается "gen_").Код функции генератора не выполняется.

Этот объект итератора используется для управления функцией генератора и поддерживает контекст выполнения функции генератора.Объект итератора предоставляет свойство [[GeneratorLocation]], которое, как я предполагаю, отслеживает, где выполнение программы приостановлено.

Посредством этой ссылки объекта итератора на контекст генератора данные генератора сохраняются, тогда как обычно после завершения выполнения программы нормальной функции эти данные отбрасываются через сборщик мусора (поскольку ничто не будет указыватьк нему).

После вашего первого вызова .next () вашего итератора генератор выполняет код, пока не достигнет оператора yield.Затем он возвращает новый объект с (в вашем примере кода) {value: 1, done: false}.Поскольку для параметра done задано значение false, объект итератора знает, что работа еще не завершена, поэтому данные генератора сохраняются.

Когда выполнение программы ставится на паузу, генератор не блокируется, удаляя контекст выполнения генератора из стека вызовов.Однако он не отбрасывается, потому что ссылка объекта итератора на контекст генератора сохраняет данные генератора живыми.

При вызове .next () для итератора происходит следующее: контекст выполнения функции генератора сновапомещается на вершину стека вызовов, продолжая выполнение там, где оно было прервано, до тех пор, пока не достигнет больше операторов yield, возвращая объект с {value: undefined, done: true}.Теперь объект итератора больше не будет указывать на генератор, а функция генератора будет удалена из памяти.

...