> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/01-languages/javascript/01-language/e-controls/e3-generators/01-generators.md).

# 01. Generators

**Генераторы** — новая разновидность функций в ES6. Генераторы могут приостанавливать своё выполнение, возвращая промежуточный результат и далее возобновлять его позже, в произвольный момент времени. По сути, генератор - это пошагово выполняемая функция, для которой программист может контролировать начало следующего шага выполнения.

Основные области применения генераторов:

* Итераторы
* Асинхронные функции
* Процессы
* Finite State Machine
* Ленивые последовательности

Для объявления генератора используется конструкция `function*` (функция со звёздочкой):

```javascript
// Generator function
function* genFunc() {
  // (A)
  console.log("First");
  yield;
  console.log("Second");
}

// Generator object
const genObj = genFunc();
genObj.next();
// Output: First
genObj.next();
// output: Second
```

Внутри функции генератора могут находится `yield`-выражения - это специальные места в коде, где функция приостанавливает свое выполнение и возвращает результат во внешний мир и ожидает до тех пор, пока не позволят продолжить исполнение дальше, до следующего `yield`, или до конца функции с вызовом `return`.

Особенности генераторов:

* Генератор может быть бесконечным.
* Вызов генератора допускается везде, где можно использовать итераторы.
* Нельзя перемотать назад генератор.
* `yield` может быть использован только внутри генераторов и ни в каких других функциях.
* Generator functions are actually constructors of iterators.
* Если последним выражением генератора является `return value`, то во многих случаях `value` игнорируется. Лучше возвращать последнее значение через `yield`.
