es6
Quel résultat cette expression aura-t-elle ?
Pratiquez vos connaissances
typeof (function* f() { yield f })().next().next()Explication
Expliquer l'Erreur dans les Appels de Fonctions Génératrices en JavaScript
La réponse correcte à la question est "Erreur". Explorons pourquoi c'est le cas.
La question concerne les fonctions génératrices en JavaScript, qui sont des fonctions spéciales qui peuvent être utilisées pour contrôler l'exécution du programme. Les fonctions génératrices sont définies en utilisant le mot-clé function*, et elles utilisent le mot-clé yield pour suspendre leur exécution.
L'expression donnée dans la question est typeof (function* f() { yield f })().next().next(). Tentons de comprendre ce qui se passe ici.
function* f() { yield f }déclare une fonction génératricefqui renvoie elle-même.()invoque immédiatement la fonction génératrice, ce qui renvoie un objet Iterateur..next()appelle la méthodenext()sur l'Iterateur, ce qui renvoie un objet avec deux propriétés :value(la valeur retournée paryield) etdone(un booléen indiquant si la fonction génératrice a terminé son exécution).Enfin,
.next()est de nouveau appelée sur cet objet. C'est ici que l'erreur se produit.
En JavaScript, la méthode next() n'est définie que sur les objets Iterateur. Lorsque nous appelons .next() pour la première fois, l'objet renvoyé n'est pas un Iterateur, il est donc impossible d'appeler .next() à nouveau dessus. Par conséquent, une erreur se produit.
C'est un exemple de vigilance nécessitée lors de l'utilisation de fonctions génératrices en JavaScript. Il faut toujours veiller à utiliser les méthodes appropriées sur les bons types d'objets pour éviter de telles erreurs.
Envie d’aller plus loin ? Faites le quiz ES6 - Les bases en entier.
Commencer le Quiz