web-dev-qa-db-fra.com

Aucune cause visible pour "Jeton inattendu ILLEGAL"

Je reçois cette erreur JavaScript sur ma console:

Uncaught SyntaxError: Jeton inattendu ILLEGAL

Ceci est mon code:

var foo = 'bar';​

C'est super simple, comme vous pouvez le voir. Comment cela pourrait-il causer une erreur de syntaxe?

269
bfavaretto

L'erreur

Lorsque le code est analysé par l'interpréteur JavaScript, il est divisé en éléments appelés "jetons". Lorsqu'un jeton ne peut pas être classé dans l'un des quatre types de jeton de base , il est étiqueté "ILLEGAL" dans la plupart des implémentations et cette erreur est générée.

La même erreur se produit si, par exemple, vous essayez d’exécuter un fichier js avec un caractère non autorisé @, une accolade mal placée, un crochet, des "guillemets intelligents", des guillemets simples non fermés correctement (par exemple, this.run('dev1)), etc. sur.

De nombreuses situations différentes peuvent provoquer cette erreur. Mais si vous n'avez pas d'erreur de syntaxe évidente ou de caractère illégal, cela peut être dû à un caractère invisible illégal. Voilà en quoi consiste cette réponse.

Mais je ne vois rien d'illégal!

Il y a un caractère invisible dans le code, juste après le point-virgule. C'est le caractère nicode U+200B Zero-width (a.k.a. ZWSP, entité HTML ​). Ce caractère est connu pour provoquer l'erreur de syntaxe JavaScript Unexpected token ILLEGAL.

Et d'où vient-il?

Je ne peux pas dire avec certitude, mais mon pari est sur jsfiddle . Si vous collez du code à partir de là, il est très probable qu’il inclue un ou plusieurs caractères U+200B. Il semble que l'outil utilise ce caractère pour contrôler le retour à la ligne sur de longues chaînes.

UPDATE 2013-01-07

Après la dernière mise à jour mise à jour jsfiddle , il affiche maintenant le caractère sous forme de point rouge comme le fait le codepen. Apparemment , cela n'insère plus U+200B caractères par lui-même, ce problème devrait donc être moins fréquent à partir de maintenant.

MISE À JOUR 2015-03-17

Vagrant semble parfois être la cause de ce problème également, à cause d'un bogue dans VirtualBox . La solution, comme indiqué dans cet article de blog , consiste à définir sendfile off; dans votre configuration nginx ou EnableSendfile Off si vous utilisez Apache.

Il est également arrivé rapporté que le code collé à partir des outils de développement Chrome puisse inclure ce caractère, mais je n’ai pas pu le reproduire avec la version actuelle (22.0.1229.79 sur OSX).

Comment puis-je le repérer?

Le personnage est invisible, comment savons-nous qu'il est là? 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 la ZWSP s'affiche sous la forme <u200b>. Vous pouvez également le déboguer en ligne: jsbin affiche le caractère sous forme de point rouge dans ses panneaux de code (mais semble le supprimer après avoir enregistré et rechargé la page). CodePen.io l'affiche également sous forme de point , et le conserve même après la sauvegarde.

Problèmes liés

Ce personnage n’est pas mauvais, il peut être très utile. Cet exemple sur Wikipedia montre comment il peut être utilisé pour contrôler où une longue chaîne doit être renvoyée à la ligne suivante. Cependant, si vous ignorez la présence du personnage dans votre balise, cela peut devenir un problème. Si vous l'avez dans une chaîne (par exemple, la nodeValue d'un élément DOM qui n'a pas de contenu visible), vous pouvez vous attendre à ce qu'une chaîne soit vide, alors qu'elle ne l'est pas (même après l'application de String.trim).

ZWSP peut également provoquer l'affichage d'espaces supplémentaires sur une page HTML, par exemple lorsqu'il se trouve entre deux éléments <div> (comme indiqué sur cette question ). Ce cas n'est même pas reproductible sur jsfiddle, le personnage y étant ignoré.

Autre problème potentiel: si le codage de la page Web n'est pas reconnu comme UTF-8, le caractère peut en fait être affiché (par exemple, ​ en latin1).

Si ZWSP est présent dans le code CSS (code inline ou une feuille de style externe), les styles ne peuvent pas non plus être analysés correctement. Certains styles ne sont donc pas appliqués (comme sur cette question ).

La spécification ECMAScript

Je n'ai trouvé aucune mention de ce caractère spécifique dans la spécification ECMAScript (versions et 5.1 ). La version actuelle mentionne des caractères similaires (U+200C et U+200D) sur Section 7.1 , ce qui indique qu'ils doivent être traités comme IdentifierParts quand "en dehors des commentaires, des littéraux de chaîne" et littéraux d’expression régulière ". Ces caractères peuvent par exemple faire partie d'un nom de variable (et var x\u200c; fonctionne en effet).

Section 7.2 répertorie les caractères d’espace blanc valides (tels que tabulation, espace, espace sans pause, etc.) et mentionne de manière vague que tout autre "séparateur d’espace" Unicode (catégorie "Z") doit être traité comme un espace blanc. Je ne suis probablement pas la personne la mieux placée pour discuter des spécifications à cet égard, mais il me semble que U+200B devrait être considéré comme un espace, ce qui est en fait le cas des implémentations (au moins Chrome et Firefox) semblent les traiter comme un jeton inattendu (ou une partie d’un jeton), provoquant l’erreur de syntaxe.

494
bfavaretto

pourquoi vous cherchez ce problème dans votre code? Même si c'est copypasté.

Si vous pouvez voir ce qu'il se passe exactement après l'enregistrement du fichier dans le dossier synchronisé, vous verrez quelque chose comme ***** à la fin du fichier. Ce n'est pas du tout lié à votre code.

Solution.

Si vous utilisez nginx in vagrant box - ajoutez à la configuration du serveur:

sendfile off;

Si vous utilisez Apache in vagrant box - ajoutez à la configuration du serveur:

EnableSendfile Off;

Source du problème: Bug VirtualBox

63
Nikolay Fominyh

Cela pourrait également se produire si vous copiez du code d'un autre document (tel qu'un PDF) dans votre console et tentez de l'exécuter.

J'essayais de lire un exemple de code dans un livre Javascript que je lisais et j'ai été surpris qu'il ne soit pas lu dans la console.

Apparemment, la copie à partir de PDF introduit des caractères inattendus, illégaux et invisibles dans le code.

7
Kyle Pennell

J'ai eu cette erreur dans chrome lorsque j'avais une chaîne non terminée après la ligne indiquée par l'erreur. Après la fermeture de la chaîne, l'erreur a disparu.

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>";
5
Ozzy

J'ai eu le même problème sur mon Mac et j'ai découvert que c'était parce que le Mac remplaçait les guillemets standard par des guillemets bouclés qui sont des caractères javascript illégaux.

Pour résoudre ce problème, je devais modifier les paramètres de mon ordinateur. Préférences système => Clavier => Texte (onglet) décocher l'utilisation de citations intelligentes et de tirets (la case par défaut était cochée).

5
user3360944

Si vous exécutez un vagabond d'installation nginx + uwsgi, le problème principal est le bogue 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 dans nginx et dans uwsgi.

  1. Dans nginx.conf, sendfile off

  2. uwsgi application/config --disable-sendfile

3
msrivas

Sous OS X, le système de fichiers crée des fourchettes cachées de pratiquement tous vos fichiers, s’ils se trouvent sur un disque dur qui ne prend pas en charge HFS +. Cela peut parfois (ce qui m'est arrivé tout à l'heure) amener votre moteur JavaScript à exécuter le data-fork au lieu du code que vous souhaitez exécuter. Lorsque cela se produit, vous recevrez également

SyntaxError: Unexpected token ILLEGAL

parce que la fourchette de données de votre fichier contiendra le caractère Unicode U + 200B. Si vous supprimez le fichier Data Fork, votre script exécutera votre code réel prévu, au lieu d'un fork binaire de votre code.

. peu importe: Ces fichiers sont créés sur des volumes qui ne prennent pas en charge de manière native toutes les caractéristiques de fichier HFS (par exemple, les volumes ufs, les fichiers Windows, etc.). Lorsqu'un fichier Mac est copié sur un tel volume, sa fourchette de données est stockée sous le nom habituel du fichier et les informations HFS supplémentaires (ressource, codes de type et de créateur, etc.) sont stockées dans un deuxième fichier (au format AppleDouble), avec un nom commençant par ". ". (Ces fichiers sont bien sûr invisibles pour OS-X, mais pas pour les autres systèmes d'exploitation; cela peut parfois être ennuyeux ...)

2
Spcaeyob

Voici ma raison:

avant:

var path = "D:\xxx\util.s"

quel \u est une évasion, je l'ai trouvé en utilisant l'analyse de Codepen JS.

après:

var path = "D:\\xxx\\util.s"

et l'erreur corrigée

1
Miao1007

J'ai changé tous les espaces en & nbsp, comme ça et cela a fonctionné sans problème.

val.replace ("", "& nbsp");

J'espère que ça aide quelqu'un.

0
Erdogan

J'ai eu ce même problème et il s'est produit parce que j'avais appuyé sur la touche Entrée lors de l'ajout de code dans une chaîne de texte.

Parce que c’était une longue chaîne de texte, je voulais tout voir sans avoir à faire défiler mon éditeur de texte. J'utilisais Sublime Text comme éditeur.

0
Jordan Davis