This page was translated from English by the community.Learn more and join the MDN Web Docs community.
function*
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since сентябрь 2016 г..
Сводка
function* (ключевое словоfunction со звёздочкой) определяетфункцию-генератор.
In this article
Синтаксис
function* name([param[, param[, ... param]]]) { statements }nameИмя функции.
paramИменованные аргументы функции (параметры). Функция-генератор может иметь 255 аргументов.
statementsИнструкции составляющие тело функции.
Описание
Генераторы являются функциями с возможностью выхода и последующего входа. Их контекст исполнения (значения переменных) сохраняется при последующих входах.
Когда вызывается функция-генератор, её тело исполняется не сразу; вместо этого возвращается объект-итератор. При вызове методаnext() итератора тело функции-генератора исполняется до первого встреченного оператораyield, который определяет возвращаемое значение или делегирует дальнейшее выполнение другому генератору при помощиyield* anotherGenerator(). Методnext() возвращает объект со свойствомvalue, содержащим отданное значение, и свойствомdone, которое указывает, что генератор уже отдал своё последнее значение. Вызов методаnext() с аргументом прекращает выполнение функции-генератора, и заменяет инструкцию yield на которой было приостановлено выполнение на аргумент переданный вnext().
Примеры
>Простой пример
function* idMaker() { var index = 0; while (index < 3) yield index++;}var gen = idMaker();console.log(gen.next().value); // 0console.log(gen.next().value); // 1console.log(gen.next().value); // 2console.log(gen.next().value); // undefined// ...Пример с yield*
function* anotherGenerator(i) { yield i + 1; yield i + 2; yield i + 3;}function* generator(i) { yield i; yield* anotherGenerator(i); yield i + 10;}var gen = generator(10);console.log(gen.next().value); // 10console.log(gen.next().value); // 11console.log(gen.next().value); // 12console.log(gen.next().value); // 13console.log(gen.next().value); // 20Передача аргументов в генератор
function* logGenerator() { console.log(yield); console.log(yield); console.log(yield);}var gen = logGenerator();// первый вызов next выполняется от начала функции// и до первого оператора yieldgen.next();gen.next("pretzel"); // pretzelgen.next("california"); // californiagen.next("mayonnaise"); // mayonnaiseИнструкция return в генераторе
function* yieldAndReturn() { yield "Y"; return "R"; yield "unreachable";}var gen = yieldAndReturn();console.log(gen.next()); // { value: "Y", done: false }console.log(gen.next()); // { value: "R", done: true }console.log(gen.next()); // { value: undefined, done: true }Генераторы не могут быть инстанцированы (not constructable)
function* f() {}var obj = new f(); // throws "TypeError: f is not a constructor"Спецификации
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-generator-function-definitions> |
Совместимость с браузерами
Смотрите также
- Протокол итераторов
- Операторyield
- Операторfunction
- Другие ресурсы:
- КомпиляторRegenerator из ES2015 в ES5
- Forbes Lindesay: Promises and Generators: control flow utopia — JSConf EU 2013
- Task.js