2017-05-22 1 views
0

Cela pourrait interesser quelqu'un et economiser quelques heures, un probleme de regroupement, eval vient d'un fichier et la fonction vient du second fichier.eval n'est pas une fonction

eval('console.log(0)') 
(function(x){console.log(x)})(1) 

déboucheront avec: Uncaught TypeError: eval (...) n'est pas une fonction

et c'est le correctif

eval('console.log(0)'); 
(function(x){console.log(x)})(1) 

virgule manquant, je l'ai lu plusieurs fois que point-virgule dans JS facultatif la plupart du temps.

des commentaires pourquoi eval n'est pas une fonction dans ce contexte?

+0

Bien que l'insertion de deux points soit facultative. Il est bon de comprendre que quand le moteur JS insérerait réellement un point-virgule. La lecture de cette réponse peut être utile https: // stackoverflow.com/questions/2846283/quoi-sont-les-règles-pour-javascripts-automatique-semicolon-insertion-asi – Agalo

+0

la leçon d'ici est toujours mis en point-virgule entre les fichiers en bundle :) – maciejW

Répondre

1

Ceci est l'une des rares situations dans lesquelles semicolon insertion de Javascript va vous trébucher.

Ce code:

eval('console.log(0)') 
(function(x){console.log(x)})(1) 

est équivalent à ce code:

eval('console.log(0)')(function(x){console.log(x)})(1) 

En d'autres termes, Javascript pense que l'expression eval('console.log(0)') évaluations à une fonction que vous essayez d'appeler avec le paramètre (function(x){console.log(x)}). Ce n'est évidemment pas ce que vous vouliez, vous avez donc besoin de points-virgules à la fin de vos lignes.

3

L'exécution de JS n'est pas parfaite pour deviner où les points-virgules devraient aller.

Quand il voit ceci:

eval('console.log(0)') 
(function(x){console.log(x)})(1) 

Il suppose à tort que le résultat de l'expression de la fonction invoquée immédiatement fait partie de la ligne eval (un paramètre potentiel à transmettre à la fonction potentielle que la eval est évaluée à).

Voici un exemple de savoir quand cela pourrait fonctionner:

eval("(function(message){ alert(message); })") 
 
("Hi there!");

Mais, dans votre cas, eval n'évalue pas à une fonction, afin d'essayer de passer un argument à elle échoue, donc votre message d'erreur. Mais, il a en fait moins à voir avec eval(), en particulier. Cela peut apparaître à chaque fois qu'un point-virgule est omis juste avant un IIFE ou une expression commençant par (.

L'ajout du point-virgule permet au runtime de savoir que l'IIFE est séparé. La règle est que vous devez insérer des points-virgules sur toute ligne suivie d'un ( (car c'est ainsi que commence une expression) afin de les séparer. Mais, la meilleure règle est de ne pas compter du tout sur l'insertion automatique des points-virgules et de toujours les mettre en place.

+0

c'était ma conjecture mais trouver c'était assez un cauchemar, parce que ce genre de code n'a pas été écrit à la main, il était concat de nombreuses bibliothèques tierces – maciejW

+1

@maciejW Oh, et d'ailleurs, l'utilisation de 'eval()' est fortement déconseillée en premier lieu. Cela peut mener à des attaques de script intersite, est lent et s'exécute dans une chaîne de portée modifiée. Il y a presque toujours un moyen de refactoriser le code pour ne pas avoir besoin de 'eval()'. –