Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Функции-генераторы
В языке JavaScript доступны также функции-генераторы. Функцией-генератором называется функция, которая может возвращать одно значение из нескольких значений на каждой итерации. Приостановить выполнение функции и превратить функцию в генератор позволяет ключевое слово yield
. В отличие от обычных функций после ключевого слова function
указывается символ звездочка (function*
). В качестве примера напишем функцию, которая умножает элементы последовательности на указанное число (листинг 10.7).
Листинг 10.7. Функции-генераторы
function* test(x, y) {
for (let i = 1; i <= x; i++) {
yield i * y;
}
}
let obj = test(10, 2);
for (let n of obj) {
console.log(n);
}
obj = test(3, 2);
console.log(obj.next().value); // 2
console.log(obj.next().value); // 4
console.log(obj.next().value); // 6
console.log(obj.next().value); // undefined
obj = test(3, 2);
console.log( [...obj] ); // [ 2, 4, 6 ]
После вызова функции-генератора возвращается объект, поддерживающий итерации. На каждом шаге возвращается значение, после чего состояние генератора сохраняется. При следующем вызове функции выполнение возобновляется с места, на котором прервалось. Таким образом, можно сгенерировать бесконечное число значений (по одному на каждой итерации) не опасаясь превысить лимит оперативной памяти.
Возвращаемый объект содержит метод next()
, с помощью которого можно перейти к следующему значению. Объект, возвращаемый методом next()
, содержит два свойства: value
(позволяет получить текущее значение) и done
(содержит значение true
, если больше нет значений, и false
— в противном случае):
obj = test(3, 2);
console.log( obj.next() ); // { value: 2, done: false }
console.log( obj.next() ); // { value: 4, done: false }
console.log( obj.next() ); // { value: 6, done: false }
console.log( obj.next() ); // { value: undefined, done: true }
Метод next()
позволяет также передать параметр, который вернет оператор yield
:
function* gen() {
console.log(yield); // 1
console.log(yield); // 2
}
let obj = gen();
obj.next();
obj.next('1');
obj.next('2');
Оператор yield
позволяет также делегировать дальнейшее выполнение другому генератору. В этом случае после оператора yield
указывается символ *
:
function* gen1() {
yield 0;
yield* gen2();
}
function* gen2() {
yield 1;
yield 2;
}
function* gen3() {
yield* [1, 2, 3];
}
let obj = gen1();
console.log(obj.next().value); // 0
console.log(obj.next().value); // 1
console.log(obj.next().value); // 2
obj = gen3();
console.log(obj.next().value); // 1
console.log(obj.next().value); // 2
console.log(obj.next().value); // 3
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов