Это функция генератора .
Генераторы - это функции, которые можно завершить, а затем снова ввести. Их контекст (привязки переменных) будет сохранен при повторном входе.
Вызов функции генератора не выполняет ее тело немедленно; вместо этого возвращается объект-итератор для функции. Когда next()
вызывается метод итератора, тело функции генератора выполняется до первого yield
выражения, которое указывает значение, которое будет возвращено из итератора или, с помощью yield*
, делегатов другой функции генератора.
Историческая справка:
Это предложенный синтаксис для EcmaScript.next
.
Дейв Герман из Mozilla выступил с докладом о EcmaScript.next . В 30:15 он говорит о генераторах.
Ранее он объяснял, как Mozilla экспериментально внедряет предложенные изменения языка для управления комитетом. Дейв тесно сотрудничает с Бренданом Эйчем, техническим директором Mozilla (я думаю) и оригинальным дизайнером JavaScript.
Вы можете найти более подробную информацию в вики рабочей группы EcmaScript: http://wiki.ecmascript.org/doku.php?id=harmony:generators
Рабочая группа (TC-39) имеет общее согласие с тем, что EcmaScript.next должен иметь какое-то предложение генератора итератора, но это не является окончательным.
Вы не должны полагаться на это отображение без изменений в следующей версии языка, и даже если оно не изменится, оно, вероятно, не будет отображаться в других браузерах некоторое время.
обзор
Сопрограммы первого класса, представленные в виде объектов, инкапсулирующих приостановленные контексты выполнения (т. Е. Активации функций). Предшествующий уровень техники: Python, Icon, Lua, Scheme, Smalltalk.
Примеры
«Бесконечная» последовательность чисел Фибоначчи (несмотря на поведение около 2 53 ):
function* fibonacci() {
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
Генераторы могут быть повторены в циклах:
for (n of fibonacci()) {
// truncate the sequence at 1000
if (n > 1000)
break;
print(n);
}
Генераторы являются итераторами:
let seq = fibonacci();
print(seq.next()); // 1
print(seq.next()); // 2
print(seq.next()); // 3
print(seq.next()); // 5
print(seq.next()); // 8
function*
синтаксис поддерживается в Firefox начиная с версии 26: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… *. Старые версии использовали другой синтаксис.