Keine sichtbare Ursache für "Unexpected token ILLEGAL"
Ich bin mir immer dieses JavaScript-Fehler auf meiner Konsole:
Uncaught SyntaxError: Unexpected token ILLEGAL
Dies ist mein code:
JS:
var foo = 'bar';
Es ist super einfach, wie Sie sehen können. Wie kann es sein, verursachen einen syntax-Fehler?
- Für zukünftige Leser: wenn Sie auf diesen Fehler bei der Verwendung von Vagrant - diese Antwort kann auch hilfreich sein: stackoverflow.com/questions/9479117/...
- In der Veranstaltung, die Sie erleben dies in WordPress -, enqueue-Skripte aus functions.php. Ich hatte eine bestimmte Vorlage, wo ich war, riefen die JS direkt aus der Vorlage. Der Wechsel zu einer bedingten enqueue in beiden wp_head oder wp_footer dieses Problem gelöst.
- Moderator ' s Note: habe ich gelöscht eine Reihe von Antworten hier, die eigentlich gar nicht die Frage beantworten. Dies ist kein, ich wiederhole mich nicht, ein Ort, um die Liste jede mögliche Sache, die Sie tun können, um JavaScript-Code, wird dieser Fehler führen. Die Frage hat einen sehr spezifischen Umstand, dass nicht mit jedem dieser Szenarien, und alle diese Beispiele einfach nicht die Frage beantworten.
- Wow, SO hatte die Polizei ein Feld Tag mit dieser Frage. Zum Glück, einige der relevanten Informationen ist immer noch sichtbar in die gelöschten Antworten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Fehler
Wenn der code geparst wird vom JavaScript-interpreter, wird es in viele Stücke zerbrochen, sogenannte "Token". Wenn ein token kann nicht klassifiziert werden in eines der vier basic-token-Typen, es wird mit der Aufschrift "ILLEGAL" auf den meisten Implementierungen, und dieser Fehler wird geworfen.
Den gleichen Fehler wird ausgelöst, wenn, zum Beispiel, Sie versuchen, führen Sie eine js-Datei mit einem Schurken
@
Charakter, eine falsch gesetzte geschweifte Klammer, Klammer, "intelligente Anführungszeichen", " einfache Anführungszeichen, nicht geschlossene Ordnung (z.B.this.run('dev1)
) und so weiter.Aber ich kann nicht sehen, nichts illegales!
Es ist eine unsichtbare Zeichen in den code, direkt nach dem Semikolon. Es ist die Unicode
U+200B
Zero-width space Zeichen (ein.k.ein.ZWSP
- , HTML-Entität​
). Das Zeichen ist bekannt, dass dieUnexpected token ILLEGAL
JavaScript-syntax-Fehler.Und Woher kommt es?
Kann ich nicht sicher sagen, aber meine Wette ist auf jsfiddle. Wenn Sie fügen Sie code von dort, es ist sehr wahrscheinlich, um einen oder mehrere
U+200B
Zeichen. Es scheint, nutzt das tool, dass der Charakter die Kontrolle der Zeilenumbruch bei überlangen Zeichenfolgen.Es wurde auch gemeldet, dass code eingefügt werden aus der Chrome developer tools können beinhalten, dass der Charakter, aber ich war nicht in der Lage zu reproduzieren, die mit der aktuellen version (22.0.1229.79 auf OSX).
Wie kann ich es erkennen?
Den Charakter unsichtbar ist, zu tun, wie wir wissen, es ist da? Sie können Fragen Sie Ihren editor, um zu zeigen, unsichtbare Zeichen. Die meisten text-Editoren haben dieses feature. Vim, zum Beispiel, zeigt Ihnen standardmäßig, und die
ZWSP
zeigt, wie<u200b>
. Sie können auch die debug-online: jsbin zeigt das Zeichen als einen roten Punkt auf der code-Scheiben (scheint aber entfernen Sie ihn nach dem speichern und Neuladen der Seite). CodePen.io auch zeigt es einen Punkt, und hält es auch nach dem speichern.Verwandte Probleme
Dieser Charakter ist nicht etwas schlecht, kann es tatsächlich sehr nützlich sein. In diesem Beispiel auf Wikipedia zeigt, wie es kann verwendet werden, um zu Steuern, wo eine lange Zeichenfolge sollte in die nächste Zeile umbrochen. Allerdings, wenn Sie sich nicht bewusst, den Charakter der Anwesenheit auf Ihrem markup, es kann ein problem werden. Wenn Sie es innerhalb von einem string (z.B. die
nodeValue
eines DOM-Elements, die keinen sichtbaren Inhalt), könnte man erwarten, dass solche Zeichenkette leer sein, wenn in der Tat ist es nicht (auch nach dem anwendenString.trim
).ZWSP
kann auch dazu führen, zusätzliche Leerzeichen angezeigt werden, die auf eine HTML-Seite, beispielsweise wenn es zwischen zwei<div>
Elemente (wie gesehen auf diese Frage). Dieser Fall ist auch nicht reproduzierbar auf jsfiddle, da die Zeichen ignoriert es.Ein weiteres potenzielles problem: wenn die web-Seite-Codierung nicht als UTF-8 erkannt, wird der Charakter kann tatsächlich angezeigt werden (als
​
in latin1, zum Beispiel).Wenn
ZWSP
vorhanden ist, die auf CSS-code (inline-code, oder einem externen stylesheet) können Stile auch nicht ordnungsgemäß analysiert werden, so dass einige Stile nicht angewendet werden (sehen Sie wie auf diese Frage).Der ECMAScript-Spezifikation
Konnte ich nicht finden keine Erwähnung, dass bestimmte Zeichen auf der ECMAScript-Spezifikation (Versionen Drei und 5.1). Die aktuelle version nennt ähnliche Zeichen (
U+200C
undU+200D
) auf Abschnitt 7.1, die sagt, Sie sollten behandelt werden wieIdentifierPart
s, wenn "außerhalb von Kommentaren, string-Literale, und reguläre Ausdrücke Literale". Diese Zeichen kann zum Beispiel ein Teil der einen Variablen-Namen (undvar x\u200c;
tatsächlich funktioniert).Abschnitt 7.2 listet die gültigen White-space-Zeichen (wie tab, space, no-break space, etc.), und vage erwähnt, dass jede andere Unicode "Leerzeichen" (Kategorie "Zs") sollten behandelt werden wie weiße Leerzeichen. Ich bin wahrscheinlich nicht die beste person, um zu diskutieren, was die Spezifikationen in dieser Hinsicht, aber es scheint mir, dass
U+200B
sollte berücksichtigt werden weiße Raum, nach, dass, wenn in der Tat die Implementierungen (zumindest Chrome und Firefox) angezeigt wird, behandeln Sie als ein unerwartetes token (teilweise oder ganz), was den syntax-Fehler.function
Schlüsselwort, das den unsichtbaren in Vim, bis ich markiert es mit dem "Markieren Sie alle nicht-druckbaren Zeichen" FAQ-Methode. Ahh ... es wäre so schön, wenn es eine Möglichkeit nur kopieren chars im Bereich von 32..127 (aber es gibt wahrscheinlich eine app dafür 🙂 )warum Sie auf der Suche nach diesem problem in Ihrem code? Auch, wenn es copypasted.
Wenn Sie sehen können, was genau geschieht nach dem speichern der Datei im synchronisierten Ordner und Sie werden sehen, so etwas wie
*****
am Ende der Datei. Es ist nicht mit deinem code.Lösung.
Wenn Sie
nginx
in vagrant box add server config:Wenn Sie
apache
in vagrant box add server config:Quelle des Problems: VirtualBox Fehler
Dies auch geschehen könnte, wenn Sie das kopieren von code aus anderen Dokumenten (wie PDF) in die Konsole ein, und versuchen Sie, es auszuführen.
Ich versuchte zu laufen ein paar Beispiel-code aus einer Javascript-Buch, das ich lese und war überrascht, dass es nicht laufen in der Konsole.
Offenbar kopieren der PDF-Datei enthält einige unerwartete, illegal, und unsichtbare Zeichen in den code ein.
Ich hatte das gleiche problem auf meinem mac gefunden, es war, weil die Mac-ersetzt die standard-Angebote mit curly-Angebote, die illegal sind javascript-Zeichen.
Um dies zu beheben musste ich die Einstellungen auf meinem mac-System-Einstellungen=>Tastatur=>Text(tab) deaktivieren, verwenden Sie typografische Anführungszeichen und Gedankenstriche (default aktiviert war).
Bekam ich diese Fehlermeldung in chrome, wenn ich hatte eine nicht beendete Zeichenkette nach der Zeile, die den Fehler hinwies. Nach dem schließen der string der Fehler ging Weg.
Beispiel mit Fehler:
Beispiel ohne Fehler:
Wenn Sie ein nginx + uwsgi vagrant-setup dann das Hauptproblem ist die Virtual box Fehler mit Datei senden, wie erwähnt, einige der Antworten. Jedoch, es zu beheben, müssen Sie deaktivieren sendfile in beiden nginx und uwsgi.
In der nginx.conf
sendfile off
uwsgi application /config
--disable-sendfile
Wenn OS X das Dateisystem erstellt versteckte Kopien von im Grunde alle Ihre Dateien, wenn Sie auf einer Festplatte, die keine Unterstützung für HFS+. Dies kann manchmal (passiert mir gerade jetzt) führen Ihre JavaScript-engine versucht, führen Sie die Daten-Gabel, anstatt den code, den Sie beabsichtigen, es zu führen. Wenn dies geschieht, erhalten Sie auch
weil die Daten-fork der Datei enthält den Unicode U+200B Charakter. Entfernen Sie die Daten-fork der Datei wird Ihr Skript laufen, Ihre tatsächlichen, soll-code, anstelle von binären Daten, die Gabel von deinem code.
Hier ist mein Grund:
bevor:
die
\u
ist eine Flucht, ich habe es herausgefunden indem Codepen's analysieren JS.nach:
und der Fehler behoben
Ich hatte das gleiche problem und es ist aufgetreten, da hatte ich die enter-Taste, wenn das hinzufügen von code in einem text-string.
Weil es war eine lange Zeichenfolge von text, den ich wollte, um alles zu sehen, ohne zu scrollen in meinem text-editor, jedoch drücken der EINGABETASTE Hinzugefügt, unsichtbaren Zeichen zu der Zeichenkette, die war illegal. Ich war mit Sublime Text als mein editor.
Ich änderte alle Räumlichkeiten zu  , einfach so, und es funktionierte ohne problem.
Ich hoffe, es hilft jemand.