web-dev-qa-db-fra.com

La signification de "'x' n'est pas une fonction ou sa valeur de retour n'est pas iTérable" erreur

J'ai accidentellement été témoin que cela provoque une erreur en V8 (chrome, nœud.js, etc.):

for (let val of Symbol()) { /*...*/ }

TypeError: Le symbole n'est pas une fonction ou sa valeur de retour n'est pas iTable

Il semble que toute autre valeur non itérable (y compris une fonction) provoque une autre erreur:

for (let val of function () { throw 'never called' }) { /*...*/ }

TypeError: (valeur intermédiaire) n'est pas iTable

AS la référence états, l'erreur est spécifique à Chrome:

TypeError: 'x' n'est pas une fonction ou sa valeur de retour n'est pas ibler (chrome)

...

La valeur qui est donnée comme le côté droit de la main de ... de ou comme argument d'une fonction telle que prometteuse.all ou typédarray.from, n'est pas un objet itérable. Un iTable peut être un type iTable intégré tel que le tableau, la chaîne ou la carte, un résultat de générateur ou un objet mettant en œuvre le protocole iTable.

Il semble qu'aucune des choses énumérées ne devait accepter une fonction au lieu de traitable comme argument, il n'est donc pas clair pourquoi l'erreur met l'accent sur le type de fonction.

Y a-t-il un sens à cette erreur? Y a-t-il des circonstances sous lesquelles is not a function remarque a du sens dans son contexte?

7
Estus Flask

Oui, il y a une signification pour les deux parties du message d'erreur. Dans le cas où vous avez à portée de main, la valeur de retour de Symbol() n'est pas démarrée, c'est donc la deuxième option. À titre d'exemple pour la première option, prenez simplement quelque chose qui n'est pas une fonction:

let NotAFunction = {};  // Or any other object.
for (let val of NotAFunction()) {}

donne: Uncaught TypeError: NotAFunction is not a function or its return value is not iterable. Dans ce cas, clairement, NotAFunction n'est pas une fonction ;-)

Je ne sais pas pourquoi il n'y a pas deux messages d'erreur distincts pour "Ce n'est pas une fonction du tout" et "c'était une fonction et on l'appelle, mais son type de retour n'était pas démarré". Probablement quelque chose dans la logique interne à mettre en œuvre for..of Les boucles l'ont rendue interditivement compliquée d'avoir une déclaration erronée fine-graine - de sorte que le message d'erreur combiné mentionne simplement deux raisons possibles pour lesquelles la boucle n'a pas fonctionné.

2
jmrk