Это экспериментальная технология, часть предложения Harmony (ECMAScript 6).
Поскольку спецификация этой технологии ещё не стабилизировалась, проверьте таблицу совместимости её использования в различных браузерах. Также обратите внимание, что синтаксис и поведение экспериментальной технологии могут быть изменены в будущих версиях браузеров в соответствии с изменениями в спецификации.
Сводка
function* (ключевое слово function со звёздочкой) определяет функцию-генератор.
Синтаксис
function* gen(i){
while(true){
yield i++;
yield* anotherGenerator(i);
}
}
Описание
Генераторы являются функциями с возможностью повторного входа после выхода. Их контекст исполнения (значения переменных) сохраняется при последующих входах.
Когда вызывается функция-генератор, её тело исполняется не сразу; вместо этого возвращается объект-итератор. При вызове метода next() итератора, тело функции-генератора исполняется до первого встреченного оператора yield, который определяет возвращаемое значение или делегирует возврат другому генератору при помощи yield* anotherGenerator(). Метод next() возвращает объект со свойством value, содержащим отданное значение, и свойством done, которое указывает, что генератор уже отдал своё последнее значение.
Примеры
Простой пример
function* idMaker(){
var index = 0;
while(true)
yield index++;
}
var gen = idMaker();
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
// ...
Спецификации
| Спецификация | Статус | Комментарий |
|---|---|---|
| Предложение Harmony | Черновик | Начало работы над стандартом. |
| ECMAScript 2015 (6th Edition, ECMA-262) Определение 'Генераторы' в этой спецификации. |
Стандарт | Изначальное определение в стандарте ECMA. |
Совместимость с браузерами
| Возможность | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
|---|---|---|---|---|---|
| Базовая поддержка | 39 | 26.0 (26.0) | Нет | 26 | Нет |
| Возможность | Android | Firefox Mobile (Gecko) | IE Phone | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|
| Базовая поддержка | yes (when?) | 27.0 (27.0) | Нет | Нет | Нет |
Генераторы и итераторы до версии Firefox 26
В старых версиях Firefox была реализована иная версия генераторов. В ней генераторы определялись обычным ключевым словом function (без звёздочки) и имели некоторые другие отличия.
Смотрите также
- Протокол итераторов
- Оператор yield
- Оператор function
- Другие ресурсы:
- Компилятор Regenerator из ES6 в ES5
- Forbes Lindesay: Promises and Generators: control flow utopia -- JSConf EU 2013
- Task.js

