Es ist eine Generatorfunktion .
Generatoren sind Funktionen, die beendet und später wieder eingegeben werden können. Ihr Kontext (variable Bindungen) wird über alle Eingänge hinweg gespeichert.
Das Aufrufen einer Generatorfunktion führt ihren Körper nicht sofort aus. Stattdessen wird ein Iteratorobjekt für die Funktion zurückgegeben. Wenn die next()
Methode des Iterators aufgerufen wird, wird der Hauptteil der Generatorfunktion bis zum ersten yield
Ausdruck ausgeführt, der den Wert angibt, der vom Iterator zurückgegeben oder mit yield*
einer anderen Generatorfunktion delegiert werden soll.
Historischer Hinweis:
Es ist eine vorgeschlagene Syntax für EcmaScript.next
.
Dave Herman von Mozilla hielt einen Vortrag über EcmaScript.next . Um 30:15 spricht er über Generatoren.
Zuvor erklärte er, wie Mozilla vorgeschlagene Sprachänderungen experimentell umsetzt, um das Komitee zu steuern. Dave arbeitet eng mit Brendan Eich, Mozillas CTO (glaube ich) und dem ursprünglichen JavaScript-Designer zusammen.
Weitere Informationen finden Sie im Wiki der EcmaScript-Arbeitsgruppe: http://wiki.ecmascript.org/doku.php?id=harmony:generators
Die Arbeitsgruppe (TC-39) ist sich allgemein einig, dass EcmaScript.next einen Vorschlag für einen Generator-Iterator enthalten sollte, der jedoch nicht endgültig ist.
Sie sollten sich nicht darauf verlassen, dass dies ohne Änderungen in der nächsten Version der Sprache angezeigt wird, und selbst wenn es sich nicht ändert, wird es wahrscheinlich für eine Weile nicht in anderen Browsern angezeigt.
Überblick
Erstklassige Coroutinen, dargestellt als Objekte, die suspendierte Ausführungskontexte einschließen (dh Funktionsaktivierungen). Stand der Technik: Python, Icon, Lua, Scheme, Smalltalk.
Beispiele
Die "unendliche" Folge von Fibonacci-Zahlen (ungeachtet des Verhaltens um 2 53 ):
function* fibonacci() {
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
Generatoren können in Schleifen durchlaufen werden:
for (n of fibonacci()) {
// truncate the sequence at 1000
if (n > 1000)
break;
print(n);
}
Generatoren sind Iteratoren:
let seq = fibonacci();
print(seq.next()); // 1
print(seq.next()); // 2
print(seq.next()); // 3
print(seq.next()); // 5
print(seq.next()); // 8
function*
Syntax wird in Firefox seit Version 26 unterstützt: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… *. Ältere Versionen verwendeten eine andere Syntax.