В чем разница между "новым" и непосредственным вызовом функции генератора?

Я знаю разницу между "новым" и прямым вызовом нормальной функции.

Но как насчет случая для функции генератора?

например:

function *counter(){
    let n = 0;
    while (n < 2) {
        yield n++;
    }
    return 10;
}

var countIter1 = new counter();
var countIter2 = counter();

кажется они одинаковые?

1 ответ

Генераторы позволяют вам определять итеративный алгоритм, написав одну функцию, которая может поддерживать свое собственное состояние. Генератор - это особый тип функции, который работает как фабрика для итераторов. Функция становится генератором, если она содержит одно или несколько выражений yield. Когда вызывается функция генератора, тело функции не выполняется сразу; вместо этого он возвращает объект генератора-итератора. Каждый вызов метода next() генератора-итератора будет выполнять тело функции до следующего выражения yield и возвращать свой результат. При достижении конца функции или оператора return возникает исключение StopIteration. Функция генератора может использоваться непосредственно в качестве метода итератора класса, что значительно сокращает объем кода, необходимого для создания пользовательских итераторов.

 function Range(low, high){
      this.low = low;
      this.high = high;
    }
    Range.prototype.__iterator__ = function(){
      for (var i = this.low; i <= this.high; i++)
        yield i;
    };
    var range = new Range(3, 5);
    for (var i in range)
      print(i); // prints 3, then 4, then 5 in sequence

Не все генераторы прекращают работу; можно создать генератор, представляющий бесконечную последовательность.

Другие вопросы по тегам