To funkcja generatora .
Generatory to funkcje, z których można wyjść, a następnie ponownie wprowadzić. Ich kontekst (powiązania zmienne) zostaną zapisane we wszystkich wejściach.
Wywołanie funkcji generatora nie powoduje natychmiastowego wykonania jej treści; zamiast tego zwracany jest obiekt iteratora dla funkcji. Po next()
wywołaniu metody iteratora ciało funkcji generatora jest wykonywane do pierwszego yield
wyrażenia, które określa wartość, która ma zostać zwrócona z iteratora lub, za pomocą yield*
, deleguje do innej funkcji generatora.
Nota historyczna:
Jest to proponowana składnia dla EcmaScript.next
.
Dave Herman z Mozilli wygłosił wykład na temat EcmaScript.next . O 30:15 mówi o generatorach.
Wcześniej wyjaśnia, w jaki sposób Mozilla eksperymentalnie wdraża proponowane zmiany językowe, aby pomóc kierować komitetem. Dave ściśle współpracuje z Brendanem Eichem, CTO Mozilli (myślę) i oryginalnym projektantem JavaScript.
Więcej informacji można znaleźć na wiki grupy roboczej EcmaScript: http://wiki.ecmascript.org/doku.php?id=harmony:generators
Grupa robocza (TC-39) zgodziła się ogólnie, że EcmaScript.next powinien mieć jakąś propozycję iteratora generatora, ale to nie jest ostateczne.
Nie powinieneś polegać na tym, że będzie się wyświetlać bez zmian w następnej wersji języka, a nawet jeśli się nie zmieni, prawdopodobnie przez jakiś czas nie pojawi się szeroko w innych przeglądarkach.
Przegląd
Pierwszorzędne coroutines, reprezentowane jako obiekty otaczające zawieszone konteksty wykonania (tj. Aktywacje funkcji). Stan techniki: Python, Ikona, Lua, Schemat, Smalltalk.
Przykłady
„Nieskończona” sekwencja liczb Fibonacciego (niezależnie od zachowania około 2 53 ):
function* fibonacci() {
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
Generatory można iterować w pętlach:
for (n of fibonacci()) {
// truncate the sequence at 1000
if (n > 1000)
break;
print(n);
}
Generatory są iteratorami:
let seq = fibonacci();
print(seq.next()); // 1
print(seq.next()); // 2
print(seq.next()); // 3
print(seq.next()); // 5
print(seq.next()); // 8
function*
składnia jest obsługiwana w Firefox od wersji 26: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… *. Starsze wersje używały innej składni.