Die function* Deklaration ( Schlüsselwort function gefolgt von einem Stern) definiert eine Generatorfunktion, welche ein Generator Objekt zurückgibt.
Eine Generatorfunktions kann auch mittels des GeneratorFunction Konstruktors und eines function* Ausdrucks definiert werden.
Syntax
function* name([param[, param[, ... param]]]) {
statements
}
name- Der Name der Funktion.
param- Der Name eines an die Funktion zu übergebenen 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 (Variablenbindungen) bleiben über die Wiedereintritte hinweg erhalten.
Der Aufruf einer Generatorfunktion führt ihren Körper nicht sofort aus; stattdessen wird ein Iteratorobjekt der Funktion zurückgegeben. Wenn die next() Methode des Iterators aufgerufen wird, wird der Körper der Generatorfunktion bis zum ersten yield Ausdruck ausgeführt, welcher 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, welche den zurückgegebenen Wert enthält und eine Eigenschaft done, welche 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.
Beispiele
Einfaches Beispiel
function* idMaker(){
var index = 0;
while(index < 3)
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); // undefined
// ...
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(yield);
console.log(yield);
console.log(yield);
}
var gen = logGenerator();
// the first call of next executes from the start of the function
// until the first yield statement
gen.next();
gen.next('pretzel'); // pretzel
gen.next('california'); // california
gen.next('mayonnaise'); // mayonnaise
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 verfügren nicht über [[Construct]] trap und erzeugen eine Ausnahme bei der Verwendung von new. |
| ECMAScript 2017 Draft (ECMA-262) Die Definition von 'function*' in dieser Spezifikation. |
Entwurf |
Browserkompatibilität
| Feature | Chrome | Firefox (Gecko) | Internet Explorer | Edge | Opera | Safari (WebKit) |
|---|---|---|---|---|---|---|
| Basic support | 39.0 | 26.0 (26.0) | Nicht unterstützt | 13 | 26 | Nicht unterstützt |
yield* |
(Ja) | 27.0 (27.0) | Nicht unterstützt | 13 | 26 | Nicht unterstützt |
IteratorResult object instead of throwing |
(Ja) | 29.0 (29.0) | Nicht unterstützt | 13 | (Ja) | Nicht unterstützt |
Not constructable with new as per ES2016 |
(Ja) | 43.0 (43.0) | ? | ? | ? | ? |
| Feature | Android | Android Webview | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile | Chrome for Android |
|---|---|---|---|---|---|---|---|
| Basic support | Nicht unterstützt | (Ja) | 26.0 (26.0) | Nicht unterstützt | Nicht unterstützt | Nicht unterstützt | 39.0 |
yield* |
Nicht unterstützt | (Ja) | 27.0 (27.0) | Nicht unterstützt | Nicht unterstützt | Nicht unterstützt | (Ja) |
IteratorResult object instead of throwing |
Nicht unterstützt | ? | 29.0 (29.0) | Nicht unterstützt | Nicht unterstützt | Nicht unterstützt | (Ja) |
Not constructable with new as per ES2016 |
? | ? | 43.0 (43.0) | ? | ? | ? | ? |
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
function* expressionGeneratorFunctionObjekt- Das Iteratorprotokol
yieldyield*Functionobjectfunction declarationfunction expressionFunctions and function scope- Andere Quellen im Web:
- Regenerator an ES2015 generator compiler to ES5
- Forbes Lindesay: Promises and Generators: control flow utopia -- JSConf EU 2013
- Hemanth.HM: The New gen of *gen(){}
- Task.js