This article is in need of a technical review.
This article is in need of an editorial review.
Это экспериментальная технология, часть предложения Harmony (ECMAScript 6).
Поскольку спецификация этой технологии ещё не стабилизировалась, проверьте таблицу совместимости её использования в различных браузерах. Также обратите внимание, что синтаксис и поведение экспериментальной технологии могут быть изменены в будущих версиях браузеров в соответствии с изменениями в спецификации.
Сводка
function* (ключевое слово function со звёздочкой) определяет функцию-генератор.
Синтаксис
function* gen(i){
while(true){
yield i++;
yield* anotherGenerator(i);
}
}
Описание
Генераторы являются функциями с возможность повторного входа после выхода. Их контекст исполнения (значения переменных) сохраняется при последующих входах.
Вызов функции-генератора не вызывает немедленное исполнение её тела; вместо этого в ней возвращается объект итератор. При вызове метода итератора next(), тело функции-генератора возобновляет свою работу до первого встреченного оператора yield, который определяет возвращаемое значение или делегирует возврат другому генератору при помощи yield* anotherGenerator().
Примеры
Простой пример
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 6 (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

