В чем разница между "новым" и непосредственным вызовом функции генератора?
Я знаю разницу между "новым" и прямым вызовом нормальной функции.
Но как насчет случая для функции генератора?
например:
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
Не все генераторы прекращают работу; можно создать генератор, представляющий бесконечную последовательность.