Aucune cause visible de "jeton inattendu ILLEGAL"

Je reçois cette erreur JavaScript sur ma console:

Uncaught SyntaxError: jeton inattendu ILLÉGAL

C'est mon code:

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

L'erreur

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.

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

Et d'où vient-il?

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ères U+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, ou EnableSendfile 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).

Comment puis-je le repérer?

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.

Problèmes connexes

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

La spécification ECMAScript

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.

  1. Dans nginx.conf sendfile off

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