Signatur
Beschreibung
GeneratorFunction ist kein globales Objekt, auf das direkt zugegriffen werden kann – es ist der Konstruktor aller mit function* deklarierten Funktionen. Man erhält eine Referenz darauf über Object.getPrototypeOf(function*(){}).constructor. Jede mit function* definierte Funktion ist eine Instanz von GeneratorFunction.
Der Konstruktor erlaubt die dynamische Erzeugung von Generatorfunktionen aus einem String zur Laufzeit – ähnlich wie new Function() für normale Funktionen. Der übergebene Funktionskörper wird dabei als String übergeben. Die so erzeugten Funktionen laufen im globalen Gültigkeitsbereich und haben keinen Zugriff auf lokale Variablen der erzeugenden Umgebung.
Generatorfunktionen eignen sich hervorragend zur Implementierung von Iteratoren, zur lazy Evaluation von Sequenzen sowie zur Steuerung asynchroner Abläufe. Mit yield kann die Ausführung unterbrochen und mit next() auf dem zurückgegebenen Iterator fortgesetzt werden.
- Prototype-Kette:
GeneratorFunction.prototype→Function.prototype→Object.prototype - Instanzen: Alle
function*-Ausdrücke sind Instanzen vonGeneratorFunction. - Dynamische Erzeugung: Über
new GeneratorFunction(...args, body)können Generatorfunktionen zur Laufzeit erzeugt werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $...args | string | Optionale Parameternamen der zu erzeugenden Generatorfunktion als Strings. Können einzeln oder als kommagetrennte Liste in einem einzelnen String übergeben werden. | |
| $functionBody | string | Der Quellcode-String des Funktionskörpers der Generatorfunktion, der yield-Ausdrücke enthalten kann. |
Rückgabewert
Generator-Objekt (Iterator) liefert.Beispiele
Zugriff auf GeneratorFunction und Instanz-Check
// GeneratorFunction ist nicht global — Referenz über Prototype holen
const GeneratorFunction = Object.getPrototypeOf(function* () {}).constructor;
// Prüfen, ob eine Funktion eine Generatorfunktion ist
function* myGen() {
yield 1;
yield 2;
}
console.log(myGen instanceof GeneratorFunction); // true
console.log(myGen.constructor === GeneratorFunction); // true
// Normales Iterator-Protokoll
const iterator = myGen();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
Dynamische Generatorfunktion mit new GeneratorFunction()
const GeneratorFunction = Object.getPrototypeOf(function* () {}).constructor;
// Generatorfunktion dynamisch aus String erzeugen
const rangeGen = new GeneratorFunction(
'start',
'end',
`
for (let i = start; i <= end; i++) {
yield i;
}
`
);
// Verwendung wie eine normale Generatorfunktion
const range = rangeGen(1, 5);
const values = [...range];
console.log(values); // [1, 2, 3, 4, 5]
// Unendliche Sequenz mit lazy Evaluation
const infiniteCounter = new GeneratorFunction(`
let i = 0;
while (true) {
yield i++;
}
`);
const counter = infiniteCounter();
console.log(counter.next().value); // 0
console.log(counter.next().value); // 1
console.log(counter.next().value); // 2
// Wichtig · Fallstricke
Sicherheit: Die dynamische Erzeugung von Generatorfunktionen über new GeneratorFunction(body) birgt dieselben Sicherheitsrisiken wie eval(). Niemals unkontrollierte Benutzereingaben als Funktionskörper übergeben – dies ermöglicht Code-Injection. Content Security Policies (CSP) mit script-src 'unsafe-eval' können solche dynamischen Konstruktionen blockieren.
Gültigkeitsbereich: Dynamisch über den Konstruktor erzeugte Generatorfunktionen haben keinen Zugriff auf lokale Variablen ihrer Entstehungsumgebung – sie werden stets im globalen Scope ausgeführt.
Kein direkter globaler Zugriff: Anders als Function ist GeneratorFunction nicht als globale Variable verfügbar. Eine Referenz muss immer über Object.getPrototypeOf(function*(){}).constructor oder eine vorhandene Generatorfunktion geholt werden.
Browser-Kompatibilität: GeneratorFunction wird von allen modernen Browsern sowie Node.js seit Version 6 unterstützt.