Cette fonction, proposition pour ECMAScript 6 (Harmony), est expérimentale
Puisque cette fonction est toujours en développement dans certains navigateurs, veuillez consulter le tableau de compatibilité pour les préfixes à utiliser selon les navigateurs.
Il convient de noter qu'une fonctionnalité expérimentale peut voir sa syntaxe ou son comportement modifié dans le futur en fonction des évolutions de la spécification.
La déclaration function* (le mot-clé function suivi par un astérisque) permet de définir un générateur (aussi appelé une fonction génératrice) (un générateur est un objet Generator).
Il est également possible de définir un générateur en utilisant le constructeur GeneratorFunction et une expression function*.
Syntaxe
function* nom([param1[, param2[, ... paramN]]]) {
instructions
}
nom- Le nom de la fonction.
paramN- Le nom d'un argument qu'on passe à la fonction. Une fonction peut avoir jusqu'à 255 arguments.
instructions- Les instructions qui constituent le corps de la fonction.
Description
Les générateurs sont des fonctions qu'il est possible de quitter puis de reprendre. Le contexte d'un générateur (les liaisons avec ses variables) est sauvegardé entre les reprises successives.
Lorsqu'on appelle une fonction génératrice, son corps n'est pas exécuté immédiatement, c'est un itérateur qui est renvoyé pour la fonction. Lorsque la méthode next() de l'itérateur est appelée, le corps de la fonction génératrice est utilisé jusqu'à ce que la première expression yield soit trouvée. Cette expression définira la valeur à renvoyer pour l'itérateur. Si on utilise yield*, on pourra déléguer la génération des valeurs à une autre fonction génératrice. La méthode next() renvoie un objet dont la propriété value contient la valeur générée et une propriété done qui indique si le générateur a produit sa dernière valeur ou non.
Exemples
Exemple simple
function* créerID(){
var index = 0;
while(index < 3){
yield index++;
}
}
var gen = créerID();
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // undefined
Exemple utilisant yield*
function* autreGénérateur(i) {
yield i + 1;
yield i + 2;
yield i + 3;
}
function* générateur(i){
yield i;
yield* autreGénérateur(i);
yield i + 10;
}
var gen = générateur(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
Spécifications
| Spécification | Statut | Commentaires |
|---|---|---|
| ECMAScript 2015 (6th Edition, ECMA-262) La définition de 'function*' dans cette spécification. |
Standard | Définition initiale |
Compatibilité des navigateurs
| Fonctionnalité | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
|---|---|---|---|---|---|
| Support simple | 26.0 (26.0) | Pas de support | 26 | Pas de support | |
yield* |
(Oui) | 27.0 (27.0) | Pas de support | 26 | Pas de support |
Objet IteratorResult au lieu d'une exception |
(Oui) | 29.0 (29.0) | Pas de support | (Oui) | Pas de support |
| Fonctionnalité | Android | Webview Android | Chrome pour Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|---|
| Support simple | Pas de support | (Oui) | 39.0 | 26.0 (26.0) | Pas de support | Pas de support | Pas de support |
yield* |
Pas de support | (Oui) | (Oui) | 27.0 (27.0) | Pas de support | Pas de support | Pas de support |
Objet IteratorResult au lieu d'une exception |
Pas de support | ? | (Oui) | 29.0 (29.0) | Pas de support | Pas de support | Pas de support |
Notes spécifiques à Firefox
Les générateurs et itérateurs dans Firefox pour les versions antérieures à Firefox 26
Les anciennes versions de Firefox implémentaient une ancienne version de la proposition pour les générateurs. Dans cette version, les générateurs étaient définis avec le mot-clé function (sans astérisque) et étaient différents selon d'autres aspects. Voir la page sur les générateurs historiques pour plus d'informations.
IteratorResult au lieu d'une exception
À partir de Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26), lorsqu'un générateur est terminé, il ne renvoie plus une exception TypeError « generator has already finished ». Il renvoie désormais un objet IteratorResult comme { value: undefined, done: true } (bug 958951).
Voir aussi
- L'expression
function* - L'objet
GeneratorFunction - itérateur
yieldyield*- L'objet
Function - Les déclarations de fonction
- Les expressions de fonction
- Les fonctions
- D'autres ressources disponibles sur le Web :
- Regenerator un compilateur permettant de traduire des générateurs ES6 en du code JavaScript basé sur ES5
- Forbes Lindesay: Promises and Generators: control flow utopia -- JSConf EU 2013 (vidéo en anglais)
- Hemanth.HM: The New gen of *gen(){} (vidéo en anglais)
- Task.js