Start · Sprachen · JavaScript · Referenz · GeneratorFunction

GeneratorFunction

Klasse

Das <code>GeneratorFunction</code>-Objekt repräsentiert den Konstruktor für Generatorfunktionen und bietet Methoden zur Erzeugung neuer Generator-Funktionsobjekte.

seit JavaScript ES2015 Kategorie: core

Signatur

class GeneratorFunction extends Function

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.prototypeFunction.prototypeObject.prototype
  • Instanzen: Alle function*-Ausdrücke sind Instanzen von GeneratorFunction.
  • 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

Typ
GeneratorFunction
Beschreibung
Gibt eine neue Generatorfunktion zurück, die beim Aufruf ein 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 }
true true { value: 1, done: false } { value: 2, done: false } { 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
[1, 2, 3, 4, 5] 0 1 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.