Generators zijn speciale soorten functies in JavaScript die het gedrag van iterations kunnen manipuleren. Ze worden gedefinieerd met de function\*-syntax. Hier volgt een kort voorbeeld van hoe u een generator zou kunnen maken en gebruiken:
```
//Definitie van de generator
function* myGenerator() {
yield 1;
yield 2;
yield 3;
}
// Maak een instantie van de generator
const gen = myGenerator();
// Itereer over de waarden die door de generator worden geproduceerd
console.log(gen.next().value); // Uitvoer: 1
console.log(gen.next().value); // Uitvoer: 2
console.log(gen.next().value); // Uitvoer: 3
console.log(gen.next().value); // Uitvoer: undefined
```
In dit voorbeeld produceert de generator achtereenvolgens de waarden 1, 2 en 3. Na de derde `gen.next()`-oproep zijn er geen ‘yield’-waarden meer over, dus geeft deze `undefined` terug.
Wat hier belangrijk is, is dat de generator zijn “interne staat” onthoudt. Het weet waar het de vorige keer is gestopt. Telkens wanneer gen.next() wordt aangeroepen, gaat het vanaf het vorige punt verder, totdat er geen yield instructies meer over zijn.
U zou generators kunnen gebruiken voor verschillende doeleinden, bijvoorbeeld:
- Om complexe iteraties mogelijk te maken, bijvoorbeeld over een boom-achtige structuur.
- Om schijnbare “meerdere ingangspunten” voor functies te maken.
- Om “lui” (on-demand) berekende waarden te genereren, die alleen worden berekend wanneer nodig.
- Om asynchrone operaties te beheersen, enzovoort.
In moderne JavaScript is deze laatste use case (beheren van asynchrone operaties) belangrijk geworden, vooral met het bevorderen van async-functies, die in wezen syntaxis suiker zijn bovenop generators.