Page 207 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 207
Последовательность Фибоначчи продолжается бесконечно, и наше приложение
не знает, сколько элементов будет необходимо, что делает ее идеальным применени
ем для итераторов. Единственное различие между этим и предыдущими примерами
в том, что этот итератор никогда не будет возвращать t r ue для свойства done:
class FibonacciSequence {
[ S ym Ьol . i terator] ( ) {
let а = О , Ь = 1 ;
return {
next )
(
let rval = { value : Ь , done : false } ;
Ь += а ;
а = rval . value ;
return rval ;
} ;
Если бы мы использовали экземпляр FibonacciSequence с циклом for . . of, то
.
получили бы бесконечный цикл . . ведь числа Фибоначчи никогда не закончатся, ни
.
когда! Чтобы предотвратить это, мы добавим оператор break после 10 элементов.
const fib = new FibonacciSequence ( ) ;
l e t i = О ;
for ( let n o f fib) {
console . log n ) ;
(
if ( + +i > 9 ) break ;
Ге н е р атор ы
Г е нераторы (generator) - это функции, которые используют итератор для кон
троля своего выполнения. Обычная функция получает аргументы и возвращает зна
чение, но никакого контроля вызывающая сторона над ней не имеет. Когда вы вы
зываете функцию, управление остается у нее до завершения. Генераторы, напротив,
позволяют вам контролировать исполнение функции.
Г е нераторы приносят двоякую пользу. Во-первых, они позволяют контролировать
выполнение функции, разделяя ее на дискретные этапы. Во-вторых, они позволяют
взаимодействовать с функцией по мере ее выполнения.
Г е нератор похож на обычную функцию за двумя исключениями.
• Функция может возвратить (yield) управление вызывающей стороне в любой
момент.
• Когда вы вызываете генератор, он не запускается сразу. Вместо этого вы полу
чаете итератор. Функция запускается при вызове метода next итератора.
Генераторы 209

