Je reçois cette erreur JavaScript sur ma console:
SyntaxError non capturée: jeton inattendu ILLEGAL
Voici mon code:
var foo = 'bar';
C'est super simple, comme vous pouvez le voir. Comment cela pourrait-il provoquer une erreur de syntaxe?
javascript
syntax-error
illegal-characters
bfavaretto
la source
la source
Réponses:
L'erreur
Lorsque le code est analysé par l'interpréteur JavaScript, il est divisé en morceaux appelés "jetons". Lorsqu'un jeton ne peut pas être classé dans l'un des quatre types de jetons de base , il est étiqueté "ILLEGAL" sur la plupart des implémentations et cette erreur est levée.
La même erreur se produit si, par exemple, vous essayez d'exécuter un fichier js avec un
@
caractère escroc , une accolade frisée mal placée, un crochet, des "guillemets intelligents", des guillemets simples mal fermés (par exemplethis.run('dev1)
) et ainsi de suite.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'
U+200B
espace Unicode Zero-width (akaZWSP
, entité HTML​
). Ce caractère est connu pour provoquer l'Unexpected token ILLEGAL
erreur de syntaxe JavaScript.Et d'où vient-il?
Je ne peux pas le dire avec certitude, mais mon pari est sur jsfiddle . Si vous collez du code à partir de là, il est très probable qu'il contienne un ou plusieurs
U+200B
caractères. Il semble que l'outil utilise ce caractère pour contrôler l'habillage des mots sur les longues chaînes.Il a également été signalé que le code collé à partir des outils de développement Chrome peut inclure ce caractère, mais je n'ai pas pu le reproduire avec la version actuelle (22.0.1229.79 sur OSX).
Comment le repérer?
Le personnage est invisible, comment savons-nous qu'il est là? Vous pouvez demander à votre éditeur d'afficher des caractères invisibles. La plupart des éditeurs de texte ont cette fonctionnalité. Vim, par exemple, les affiche par défaut, et les
ZWSP
affiche comme<u200b>
. Vous pouvez également le déboguer en ligne: jsbin affiche le caractère sous la forme d'un point rouge sur ses volets 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 l'enregistrement.Problèmes liés
Ce personnage n'est pas quelque chose de mauvais, il peut en fait être très utile. Cet exemple sur Wikipedia montre comment il peut être utilisé pour contrôler où une longue chaîne doit être placée à la ligne suivante. Cependant, si vous n'êtes pas au courant de la présence du personnage sur votre balisage, cela peut devenir un problème. Si vous l'avez à l'intérieur d'une chaîne (par exemple,
nodeValue
d'un élément DOM qui n'a pas de contenu visible), vous pouvez vous attendre à ce qu'une telle chaîne soit vide, alors qu'en fait ce n'est pas le cas (même après applicationString.trim
).ZWSP
peut également entraîner l'affichage d'un espace supplémentaire sur une page HTML, par exemple lorsqu'il se trouve entre deux<div>
éléments (comme on le voit sur cette question ). Ce cas n'est même pas reproductible sur jsfiddle, car le personnage y est ignoré.Autre problème potentiel: si l'encodage de la page Web n'est pas reconnu comme UTF-8, le caractère peut en fait s'afficher (comme
​
en latin1, par exemple).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 dans la spécification ECMAScript (versions 3 et 5.1 ). La version actuelle mentionne des caractères similaires (
U+200C
etU+200D
) dans la section 7.1 , qui indique qu'ils doivent être traités comme desIdentifierPart
s "en dehors des commentaires, des littéraux de chaîne et des littéraux d'expression régulière". Ces caractères peuvent, par exemple, faire partie d'un nom de variable (etvar x\u200c;
fonctionnent en effet).La section 7.2 répertorie les caractères d'espace blanc valides (tels que tabulation, espace, espace insécable, etc.) et mentionne vaguement que tout autre «séparateur d'espace» Unicode (catégorie «Zs») doit être traité comme un espace blanc. Je ne suis probablement pas la meilleure personne pour discuter des spécifications à cet égard, mais il me semble que cela
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 comme un inattendu jeton (ou une partie), provoquant l'erreur de syntaxe.la source
function
mot - clé, qui était invisible dans Vim jusqu'à ce que je le mette en surbrillance à l'aide de la méthode FAQ "Mettre en surbrillance tous les caractères non imprimables". Ahh, ce serait tellement bien s'il y avait un moyen de copier uniquement les caractères dans la plage de 32..127 (mais il y a probablement une application pour ça :))pourquoi cherchez-vous ce problème dans votre code? Même si c'est copypassé.
Si vous pouvez voir ce qui se passe exactement après avoir enregistré le fichier dans un 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
dans une boîte vagabonde - ajoutez à la configuration du serveur:Si vous utilisez
apache
dans une boîte vagabonde - ajoutez à la configuration du serveur:Source du problème: bogue VirtualBox
la source
Cela peut également se produire si vous copiez du code d'un autre document (comme un PDF) dans votre console et essayez de l'exécuter.
J'essayais d'exécuter un exemple de code à partir d'un livre Javascript que je lis et j'ai été surpris qu'il ne s'exécute pas dans la console.
Apparemment, la copie à partir du PDF introduit des caractères inattendus, illégaux et invisibles dans le code.
la source
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, j'ai dû modifier les paramètres sur mon Mac Préférences Système => Clavier => Texte (onglet) décochez utiliser les guillemets intelligents et les tirets (la valeur par défaut a été vérifiée).
la source
J'ai obtenu cette erreur dans Chrome lorsque j'avais une chaîne non terminée après la ligne vers laquelle l'erreur pointait. Après avoir fermé la chaîne, l'erreur a disparu.
Exemple avec erreur:
Exemple sans erreur:
la source
Si vous exécutez un programme 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 uwsgi.
Dans nginx.conf sendfile off
uwsgi application / config --disable-sendfile
la source
Lors de l'exécution d'OS X, le système de fichiers crée des fourches 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) conduire à ce que votre moteur JavaScript essaie d'exécuter le data-fork au lieu du code que vous souhaitez qu'il exécute. Lorsque cela se produit, vous recevrez également
car la fourchette de données de votre fichier contiendra le caractère Unicode U + 200B. La suppression du fichier fork de données fera que votre script exécutera votre code réel prévu, au lieu d'un fork de données binaires de votre code.
la source
Voici ma raison:
avant:
ce qui
\u
est une évasion, je l'ai compris en utilisant l'analyse JS de Codepen .après:
et l'erreur corrigée
la source
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 dans mon éditeur de texte, mais en appuyant sur Entrée, un caractère invisible a été ajouté à la chaîne, ce qui était illégal. J'utilisais Sublime Text comme éditeur.
la source
J'ai changé toutes les zones d'espace en & nbsp, juste comme ça et cela a fonctionné sans problème.
J'espère que ça aide quelqu'un.
la source
Je vais ajouter une réponse de plus à la pile. Ce problème pourrait également se produire en raison de l'encodage. Vous voulez que l'encodage utf8 soit du bon côté. Certains éditeurs utilisent par défaut utf16, ce qui peut provoquer des problèmes. Un moyen rapide de tester cela est, par exemple dans le code VS, de simplement recréer le même contenu mais d'utiliser l'éditeur local de vscode pour créer le fichier. J'espère que cela aide certains.
la source