Die function* Deklaration ( Schlüsselwort function gefolgt von einem Stern) definiert eine Generatorfunktion, welche ein  Generator Objekt zurückgibt.

Eine Generatorfunktion kann auch mittels des GeneratorFunction Konstruktors definiert werden.

Syntax

function* name([param[, param[, ... param]]]) {
   statements
}
name
Der Name der Funktion.
param
Der Name eines an die Funktion zu übergebenden Arguments. Eine Funktion kann bis zu 255 Argumente haben.
statements
Die den Körper der Funktion ergebenenden Anweisungen.

Beschreibung

Generatoren sind Funktionen, die verlassen und später wieder betreten werden können. Ihr Kontext (Variablenbindung) bleibt über die Wiedereintritte hinweg erhalten.

Der Aufruf einer Generatorfunktion führt ihren Körper nicht sofort aus; stattdessen wird ein Iterator Objekt einer Funktion zurückgegeben. Wenn die next() Methode des Iterators aufgerufen wird, wird der Körper der Generatorfunktion bis zum ersten yield Ausdruck ausgeführt, der den vom Iterator zurückzugebenden Wert spezifiziert, oder mittels yield* an eine andere Generatorfunktion weitergibt. Die Methode next() gibt ein Objekt mit einer value Eigenschaft zurück, die den zurückgegebenen Wert enthält und eine Eigenschaft done, die anzeigt, ob der Generator seinen letzten Wert zurückgegeben hat (boolischer Wert). Beim Aufrufen der next() Methode mit einem Argument wird die Generator-Funktion weiter ausgeführt.

Ein return Statement in einer Generator-Funktion sorgt dafür, dass der Generator fertig ist (Status done). Falls ein Wert zurückgegeben wird, dann wird dieser als value zurückgegeben. Anschließend wird kein weiterer Wert mehr zurückgegeben.

Beispiele

Einfaches Beispiel

function* idMaker(){
  var index = 0;
  while(index < index+1)
    yield index++;
}

var gen = idMaker();

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3
// ...

Beispiel mit yield*

function* anotherGenerator(i) {
  yield i + 1;
  yield i + 2;
  yield i + 3;
}

function* generator(i) {
  yield i;
  yield* anotherGenerator(i);
  yield i + 10;
}

var gen = generator(10);

console.log(gen.next().value); // 10
console.log(gen.next().value); // 11
console.log(gen.next().value); // 12
console.log(gen.next().value); // 13
console.log(gen.next().value); // 20

Übergeben von Argumenten in Generatoren

function* logGenerator() {
  console.log(0);
  console.log(1, yield);
  console.log(2, yield);
  console.log(3, yield);
}

var gen = logGenerator();

// the first call of next executes from the start of the function
// until the first yield statement
gen.next();             // 0
gen.next('pretzel');    // 1 pretzel
gen.next('california'); // 2 california
gen.next('mayonnaise'); // 3 mayonnaise

Return Statement in einem Generator

function* yieldAndReturn() {
  yield "Y";
  return "R";
  yield "unreachable";
}

var gen = yieldAndReturn()
console.log(gen.next()); // { value: "Y", done: false }
console.log(gen.next()); // { value: "R", done: true }
console.log(gen.next()); // { value: undefined, done: true }

Generatoren haben keinen Konstruktor

function* f() {}
var obj = new f; // throws "TypeError: f ist kein Konstruktor"

Spezifikationen

Spezifikation Status Kommentar
ECMAScript 2015 (6th Edition, ECMA-262)
Die Definition von 'function*' in dieser Spezifikation.
Standard Initiale Definition.
ECMAScript 2016 (ECMA-262)
Die Definition von 'function*' in dieser Spezifikation.
Standard Änderung, dass Generatoren nicht über [[Construct]] trap verfügen und eine Ausnahme bei der Verwendung von new erzeugen.
ECMAScript Latest Draft (ECMA-262)
Die Definition von 'function*' in dieser Spezifikation.
Entwurf  

Browserkompatibilität

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid WebviewChrome für AndroidEdge MobileFirefox für AndroidOpera für AndroidiOS SafariSamsung InternetNode.js
Grundlegende UnterstützungChrome Vollständige Unterstützung 39Edge Vollständige Unterstützung 13Firefox Vollständige Unterstützung 26IE Keine Unterstützung NeinOpera Vollständige Unterstützung 26Safari Vollständige Unterstützung 10WebView Android Vollständige Unterstützung JaChrome Android Vollständige Unterstützung 39Edge Mobile Vollständige Unterstützung JaFirefox Android Vollständige Unterstützung 26Opera Android Vollständige Unterstützung JaSafari iOS Vollständige Unterstützung 10Samsung Internet Android Vollständige Unterstützung 4.0nodejs Vollständige Unterstützung 4.0.0
Vollständige Unterstützung 4.0.0
Vollständige Unterstützung 0.12
Deaktiviert
Deaktiviert From version 0.12: this feature is behind the --harmony runtime flag.
IteratorResult object instead of throwingChrome Vollständige Unterstützung 49Edge Vollständige Unterstützung 13Firefox Vollständige Unterstützung 29IE Keine Unterstützung NeinOpera Vollständige Unterstützung JaSafari Vollständige Unterstützung JaWebView Android Vollständige Unterstützung JaChrome Android Vollständige Unterstützung JaEdge Mobile Vollständige Unterstützung JaFirefox Android Vollständige Unterstützung 29Opera Android Vollständige Unterstützung JaSafari iOS Vollständige Unterstützung JaSamsung Internet Android Vollständige Unterstützung Janodejs Vollständige Unterstützung Ja
Not constructable with new (ES2016)Chrome Vollständige Unterstützung JaEdge ? Firefox Vollständige Unterstützung 43IE Keine Unterstützung NeinOpera Vollständige Unterstützung JaSafari Vollständige Unterstützung 10WebView Android Vollständige Unterstützung JaChrome Android Vollständige Unterstützung JaEdge Mobile ? Firefox Android Vollständige Unterstützung 43Opera Android Vollständige Unterstützung JaSafari iOS Vollständige Unterstützung 10Samsung Internet Android Vollständige Unterstützung Janodejs Vollständige Unterstützung Ja
Trailing comma in parametersChrome ? Edge ? Firefox Vollständige Unterstützung 52IE ? Opera Vollständige Unterstützung JaSafari ? WebView Android ? Chrome Android ? Edge Mobile ? Firefox Android Vollständige Unterstützung 52Opera Android ? Safari iOS ? Samsung Internet Android ? nodejs Vollständige Unterstützung 8.0.0

Legende

Vollständige Unterstützung  
Vollständige Unterstützung
Keine Unterstützung  
Keine Unterstützung
Kompatibilität unbekannt  
Kompatibilität unbekannt
Benutzer muss dieses Feature explizit aktivieren.
Benutzer muss dieses Feature explizit aktivieren.

Firefox-spezifische Hinweise

Generatoren und Iteratoren in Firefox-Versionen vor 26

Ältere Firefox-Versionen implementierten eine ältere Version des Generatorenentwurfs. In den älteren Versionen wurden Generatoren, neben anderen Abweichungen, mit dem normalen Schlüsselwort function (ohne den Stern) definiert. Siehe veraltete Generatorfunktion für weitere Informationen.

IteratorResult Objekt zurückgegeben anstatt Ausnahme erzeugt

Beginnend mit Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) erzeugt die ausgeführte Generatorfunktion keine TypeError "generator has already finished" Ausnahme mehr. Stattdessen gibt sie ein IteratorResult Objekt mit { value: undefined, done: true } (Bug 958951) zurück.

Siehe auch

Schlagwörter des Dokuments und Mitwirkende

Mitwirkende an dieser Seite: arothweiler, schlagi123, xstable, yampus, kdex, KuhnEDV
Zuletzt aktualisiert von: arothweiler,