Це функція генератора .
Генератори - це функції, які можна вийти та пізніше знову ввести. Їх контекст (змінні прив’язки) будуть збережені через повторні входи.
Виклик функції генератора не виконує його тіло відразу; замість цього повертається об’єкт ітератора для функції. Коли next()
виклик методу ітератора, тіло функції генератора виконується до першого yield
вираження, яке визначає значення, яке потрібно повернути з ітератора, або yield*
делегує іншій функції генератора.
Історична записка:
Це запропонований синтаксис для EcmaScript.next
.
Дейв Герман з Mozilla розповів про EcmaScript.next . О 30:15 він розповідає про генератори.
Раніше він пояснює, як Mozilla експериментально впроваджує запропоновані зміни мови, щоб допомогти керувати комітетом. Дейв тісно співпрацює з Бренданом Айчем, CTO Mozilla (я думаю) та оригінальним дизайнером JavaScript.
Більш детальну інформацію можна знайти у вікі робочої групи EcmaScript: http://wiki.ecmascript.org/doku.php?id=harmony:generators
Робоча група (TC-39) має загальну згоду, що EcmaScript.next має мати якусь пропозицію ітератора генератора, але це не є остаточним.
Ви не повинні покладатися на це відображення без змін у наступній версії мови, і навіть якщо воно не зміниться, воно, певно, деякий час не відображатиметься в інших браузерах.
Огляд
Першокласні розробки, представлені у вигляді об'єктів, що інкапсулюють призупинені контексти виконання (тобто активації функції). Рівень мистецтва: Пітон, Ікона, Луа, Схема, Малий розмову.
Приклади
"Нескінченна" послідовність чисел Фібоначчі (незважаючи на поведінку близько 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 з v26: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… *. Старіші версії використовували інший синтаксис.