Quel résultat cette expression aura-t-elle ?
typeof (function* f() { yield f })().next().next()

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.

  1. function* f() { yield f } déclare une fonction génératrice f qui renvoie elle-même.

  2. () invoque immédiatement la fonction génératrice, ce qui renvoie un objet Iterateur.

  3. .next() appelle la méthode next() sur l'Iterateur, ce qui renvoie un objet avec deux propriétés : value (la valeur retournée par yield) et done (un booléen indiquant si la fonction génératrice a terminé son exécution).

  4. 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.

Related Questions

Trouvez-vous cela utile?