Je reçois cette erreur JavaScript sur ma console:
Uncaught SyntaxError: jeton inattendu ILLÉGAL
C'est mon code:
var foo = 'bar';
C'est super simple, comme vous pouvez le constater. Comment pourrait-il provoquer une erreur de syntaxe?
Lorsque le code est analysé par l'interprète JavaScript, il est divisé en morceaux appelés «tokens». Lorsqu'un jeton ne peut pas être classé dans l'un des quatre types de jeton de base , il est étiqueté «ILLEGAL» sur la plupart des implémentations et cette erreur est lancée.
La même erreur est soulevée si, par exemple, vous essayez d'exécuter un fichier js avec un personnage rogue @
, une orthèse mal ajustée, un support, des "citations intelligentes", des guillemets simples non inclus correctement (par exemple, this.run('dev1)
) etc.
Beaucoup de situations différentes peuvent provoquer cette erreur. Mais si vous ne possédez pas d'erreur de syntaxe ou de caractère illégal évident, cela peut être dû à un caractère illégal invisible . C'est à propos de quoi cette réponse.
Il y a un caractère invisible dans le code, juste après le point-virgule. C'est le caractère d'espace ZWSP
U+200B
Zéro-largeur (aka ZWSP
, entité HTML ​
). Ce caractère est connu pour provoquer l'erreur de syntaxe Unexpected token ILLEGAL
.
Je ne peux pas le dire à coup sûr, mais mon pari est sur jsfiddle . Si vous collez le code à partir de là, il est fort susceptible d'inclure un ou plusieurs caractères U+200B
. Il semble que l'outil utilise ce caractère pour contrôler l'enveloppement de mots sur de longues chaînes.
MISE À JOUR 2013-01-07
Après la dernière mise à jour de jsfiddle , il affiche maintenant le caractère comme un point rouge comme le codepen. Apparemment , il
U+200B
caractèresU+200B
, donc ce problème devrait être moins fréquent à partir de maintenant.MISE À JOUR 2015-03-17
Vagrant semble parfois causer ce problème, en raison d'un bug dans VirtualBox . La solution, selon cette publication du blog, consiste à configurer
sendfile off;
Dans votre configuration nginx, ouEnableSendfile Off
si vous utilisez Apache.
On a également signalé que le code collé à partir des outils de développement Chrome peut inclure ce personnage, mais je n'ai pas pu le reproduire avec la version actuelle (22.0.1229.79 sur OSX).
Le personnage est invisible, comment le savons-nous? Vous pouvez demander à votre éditeur de montrer des caractères invisibles. La plupart des éditeurs de texte ont cette fonctionnalité. Vim, par exemple, les affiche par défaut, et le ZWSP
s'affiche comme <u200b>
. Vous pouvez également le déboguer en ligne: jsbin affiche le caractère en tant que point rouge sur ses volets de code (mais semble le supprimer après avoir sauvegardé et rechargé la page). CodePen.io l'affiche également comme un point , et le garde même après la sauvegarde.
Ce personnage n'est pas quelque chose de mal, il peut être assez utile. Cet exemple sur Wikipedia démontre comment il peut être utilisé pour contrôler où une longue chaîne devrait être enroulée à la ligne suivante. Cependant, si vous ignorez la présence du personnage sur votre balisage, cela pourrait devenir un problème. Si vous l'avez dans une chaîne (par exemple, nodeValue
d'un élément DOM qui n'a pas de contenu visible), vous pouvez vous attendre à ce que cette chaîne soit vide, alors qu'elle n'est pas (même après l'application String.trim
).
ZWSP
peut également générer des espaces supplémentaires dans une page HTML, par exemple lorsqu'elle se trouve entre deux éléments <div>
(comme on l'a vu sur cette question ). Ce cas n'est même pas reproductible sur jsfiddle, car le personnage y est ignoré.
Un autre problème potentiel: si le codage de la page Web n'est pas reconnu comme UTF-8, le personnage peut effectivement être affiché (par exemple, dans latin1).
Si ZWSP
est présent sur le code CSS (code en ligne ou une feuille de style externe), les styles ne peuvent pas non plus être analysés correctement, donc certains styles ne sont pas appliqués (comme on le voit sur cette question ).
Je n'ai trouvé aucune mention de ce caractère spécifique sur la spécification ECMAScript (versions 3 et 5.1 ). La version actuelle mentionne des caractères similaires ( U+200C
et U+200D
) sur la Section 7.1 , qui indiquent qu'ils devraient être traités comme IdentifierPart
s lorsqu'ils sont «en dehors des commentaires, des littéralités de chaînes et des littéraux d'expression régulière». Ces caractères peuvent, par exemple, faire partie d'un nom de variable (et var x\u200c;
effet).
La section 7.2 énumère les caractères d'espace blanc valides (tels que l'onglet, l'espace, l'espace sans interruption, etc.) et mentionne vaguement que tout autre séparateur d'espace Unicode (catégorie «Z») doit être considéré comme un espace blanc. Je ne suis probablement pas la meilleure personne pour discuter des spécifications à cet égard, mais il me semble que U+200B
devrait être considéré comme un espace blanc en fonction de cela, alors qu'en fait, les implémentations (au moins Chrome et Firefox) semblent les traiter En tant que jeton inattendu (ou partie d'un), provoquant l'erreur de syntaxe.
Pourquoi cherchez-vous ce problème dans votre code? Même s'il est copyposté.
Si vous pouvez le voir, ce qui se passe exactement après avoir sauvegardé le fichier dans le dossier synchronisé – vous verrez quelque chose comme *****
à la fin du fichier. Ce n'est pas lié à votre code.
Solution.
Si vous utilisez nginx
dans une boîte vagabancée – ajoutez à la configuration du serveur:
sendfile off;
Si vous utilisez apache
dans une boîte vagabondage – ajoutez à la configuration du serveur:
EnableSendfile Off;
Source du problème: VirtualBox Bug
Cela pourrait également se produire si vous copiez du code d'un autre document (comme un fichier PDF) dans votre console et essayez de l'exécuter.
J'essayais d'exécuter un exemple de code sur un livre de Javascript que je lis et j'étais surpris qu'il ne se soit pas déroulé dans la console.
Apparemment, la copie à partir du PDF introduit des caractères inattendus, illégaux et invisibles dans le code.
J'ai eu cette erreur dans chrome lorsque j'avais une chaîne non terminée après la ligne à laquelle l'erreur indiquait. Après avoir fermé la corde, l'erreur s'est éteinte.
Exemple avec erreur:
var file = files[i]; // SyntaxError: Unexpected token ILLEGAL jQuery('#someDiv').innerHTML = file.name + " (" + formatSize(file.size) + ") " + "<a href=\"javascript: something('"+file.id+');\">Error is here</a>";
Exemple sans erreur:
var file = files[i]; // No error jQuery('#someDiv').innerHTML = file.name + " (" + formatSize(file.size) + ") " + "<a href=\"javascript: something('"+file.id+"');\">Error was here</a>";
J'ai eu le même problème sur mon mac et j'ai trouvé que c'était parce que le Mac remplaçait les citations standard avec des citations curly qui sont des caractères javascript illégaux.
Pour corriger cela, j'ai dû modifier les paramètres sur mon Mac Préférences du système => Clavier => Texte (onglet) décocher utiliser des guillemets et des tirets intelligents (la valeur par défaut a été cochée).
Si vous utilisez un nginx + uwsgi setup vagrant, le problème principal est le bug de la boîte virtuelle avec le fichier d'envoi, comme mentionné dans certaines des réponses. Cependant, pour le résoudre, vous devez désactiver sendfile à la fois nginx et uwsgi.
Dans nginx.conf sendfile off
Uwsgi application / config –disable-sendfile
Lors de l'exécution de l'OS X, le système de fichiers crée des fourchettes cachées de tous ses fichiers fondamentalement si elles sont sur un disque dur qui ne supporte pas HFS +. Cela peut parfois (arrivé à moi tout à l'heure) conduire à votre moteur de JavaScript essaie d'exécuter la fourchette de données au lieu du code que vous souhaitez exécuter. Lorsque cela se produit, vous recevrez également
SyntaxError: Unexpected token ILLEGAL
Car la fourchette de données de votre fichier contiendra le caractère Unicode U + 200B. En supprimant le fichier fork de données, votre script exécutera votre code réel, prévu, au lieu d'une fourchette de données binaires de votre code.
. Quoi que ce soit: ces fichiers sont créés sur des volumes qui ne supportent pas automatiquement les caractéristiques du fichier HFS complet (p. Ex., Volumes ufs, partage de fichiers Windows, etc.). Lorsqu'un fichier Mac est copié sur un tel volume, sa fourchette de données est stockée sous le nom régulier du fichier, et les informations HFS supplémentaires (fourchette de ressource, code de type et créateur, etc.) sont stockées dans un deuxième fichier (au format AppleDouble) Avec un nom qui commence par ". ". (Ces fichiers sont, bien sûr, invisibles en ce qui concerne OS-X, mais pas pour d'autres systèmes d'exploitation; cela peut parfois être ennuyeux …)
J'ai eu ce même problème et cela s'est produit parce que j'avais frappé la touche enter lorsque j'ajoute un code dans une chaîne de texte.
Parce qu'il s'agissait d'une longue chaîne de texte, je voulais tout voir sans avoir à faire défiler dans mon éditeur de texte, mais entrer dans Entré a ajouté un caractère invisible à la chaîne qui était illégale. J'utilisais Sublime Text comme mon éditeur.
J'ai changé toutes les zones spatiales à & nbsp, comme ça et ça a fonctionné sans problème.
Val.replace ("", "& nbsp");
J'espère que cela aidera quelqu'un.
Voici ma raison:
avant:
var path = "D:\xxx\util.s"
Qui est une fuite, je l'ai découvert en utilisant l' analyse de Codepen JS.
après:
var path = "D:\\xxx\\util.s"
Et l'erreur est corrigée