Ich erhalte diesen JavaScript-Fehler auf meiner Konsole:
Nicht erfasster SyntaxError: Unerwartetes Token ILLEGAL
Das ist mein Code:
var foo = 'bar';
Es ist super einfach, wie Sie sehen können. Wie könnte es einen Syntaxfehler verursachen?
javascript
syntax-error
illegal-characters
bfavaretto
quelle
quelle
Antworten:
Der Fehler
Wenn Code vom JavaScript-Interpreter analysiert wird, wird er in Teile aufgeteilt, die als "Token" bezeichnet werden. Wenn ein Token nicht in einen der vier grundlegenden Token-Typen eingeteilt werden kann , wird es bei den meisten Implementierungen mit "ILLEGAL" gekennzeichnet, und dieser Fehler wird ausgelöst.
Der gleiche Fehler wird ausgelöst, wenn Sie beispielsweise versuchen, eine js-Datei mit einem Schurkenzeichen
@
, einer falsch platzierten geschweiften Klammer, einer Klammer, "intelligenten Anführungszeichen", einfachen Anführungszeichen (z. B.this.run('dev1)
) usw. auszuführen .Aber ich kann nichts Illegales sehen!
Der Code enthält direkt nach dem Semikolon ein unsichtbares Zeichen. Es ist der Unicode
U+200B
-Raum mit der Breite Null (auch bekanntZWSP
als HTML-Entität​
). Es ist bekannt, dass dieses Zeichen denUnexpected token ILLEGAL
JavaScript-Syntaxfehler verursacht.Und woher kam es?
Ich kann es nicht genau sagen, aber ich wette auf jsfiddle . Wenn Sie von dort aus Code einfügen, ist es sehr wahrscheinlich, dass einer oder mehrere enthalten sind
U+200B
Zeichen enthalten sind. Es scheint, dass das Tool dieses Zeichen verwendet, um das Umbrechen von Wörtern in langen Zeichenfolgen zu steuern.Es wurde auch berichtet, dass Code, der aus den Chrome-Entwicklertools eingefügt wurde, möglicherweise dieses Zeichen enthält, aber ich konnte dies mit der aktuellen Version (22.0.1229.79 unter OSX) nicht reproduzieren.
Wie kann ich es erkennen?
Der Charakter ist unsichtbar. Woher wissen wir, dass er da ist? Sie können Ihren Editor bitten, unsichtbare Zeichen anzuzeigen. Die meisten Texteditoren verfügen über diese Funktion. Vim zeigt sie beispielsweise standardmäßig an und
ZWSP
zeigt sie als an<u200b>
. Sie können es auch online debuggen: jsbin zeigt das Zeichen als roten Punkt in den Codefenstern an (scheint es jedoch nach dem Speichern und erneuten Laden der Seite zu entfernen). CodePen.io zeigt es auch als Punkt an an und behält es auch nach dem Speichern bei.Verwandte Probleme
Dieser Charakter ist nichts Schlechtes, er kann tatsächlich sehr nützlich sein. Dieses Beispiel auf Wikipedia zeigt, wie damit gesteuert werden kann, wo eine lange Zeichenfolge in die nächste Zeile eingeschlossen werden soll. Wenn Sie jedoch nicht wissen, dass der Charakter in Ihrem Markup vorhanden ist, kann dies zu einem Problem werden. Wenn Sie es in einer Zeichenfolge haben (z. B.
nodeValue
in einem DOM-Element, das keinen sichtbaren Inhalt hat), können Sie erwarten, dass diese Zeichenfolge leer ist, obwohl dies nicht der Fall ist (auch nach dem AnwendenString.trim
).ZWSP
kann auch dazu führen, dass zusätzliche Leerzeichen auf einer HTML-Seite angezeigt werden, z. B. wenn sie zwischen zwei<div>
Elementen gefunden werden (wie in dieser Frage dargestellt) ). Dieser Fall ist auf jsfiddle nicht einmal reproduzierbar, da das Zeichen dort ignoriert wird.Ein weiteres potenzielles Problem: Wenn die Codierung der Webseite nicht als UTF-8 erkannt wird, wird das Zeichen möglicherweise tatsächlich angezeigt (as
​
z. B. in latin1).Wenn
ZWSP
CSS-Code (Inline-Code oder ein externes Stylesheet) vorhanden ist, können Stile auch nicht ordnungsgemäß analysiert werden, sodass einige Stile nicht angewendet werden (wie in dieser Frage dargestellt ).Die ECMAScript-Spezifikation
Ich konnte in der ECMAScript-Spezifikation (Versionen 3 und 5.1 ) keine Erwähnung dieses bestimmten Zeichens finden . In der aktuellen Version werden ähnliche Zeichen (
U+200C
undU+200D
) in Abschnitt 7.1 erwähnt , in denen angegeben wird, dass sieIdentifierPart
als "außerhalb von Kommentaren, Zeichenfolgenliteralen und Literalen mit regulären Ausdrücken" behandelt werden sollten. Diese Zeichen können beispielsweise Teil eines Variablennamens sein (undvar x\u200c;
funktionieren tatsächlich).In Abschnitt 7.2 werden die gültigen Leerzeichen (wie Tabulatoren, Leerzeichen, Leerzeichen usw.) aufgelistet und vage erwähnt, dass jedes andere Unicode-Leerzeichen (Kategorie „Zs“) als Leerzeichen behandelt werden sollte. Ich bin wahrscheinlich nicht die beste Person, um die Spezifikationen in dieser Hinsicht zu diskutieren, aber es scheint mir, dass
U+200B
dies als Leerraum betrachtet werden sollte, wenn die Implementierungen (zumindest Chrome und Firefox) sie tatsächlich als unerwartet zu behandeln scheinen Token (oder ein Teil davon), der den Syntaxfehler verursacht.quelle
function
Schlüsselworts erstickt , die in Vim unsichtbar war, bis ich sie mit der FAQ-Methode "Alle nicht druckbaren Zeichen hervorheben" hervorgehoben habe. Ahh, es wäre so schön, wenn es eine Möglichkeit gäbe, nur Zeichen im Bereich von 32..127 zu kopieren (aber dafür gibt es wahrscheinlich eine App :))Warum suchen Sie nach diesem Problem in Ihrem Code? Auch wenn es kopypastiert ist.
Wenn Sie sehen können, was genau nach dem Speichern der Datei im synchronisierten Ordner passiert, sehen Sie so etwas wie
*****
am Ende der Datei. Es hängt überhaupt nicht mit Ihrem Code zusammen.Lösung.
Wenn Sie
nginx
in vagrant box verwenden - zur Serverkonfiguration hinzufügen:Wenn Sie
apache
in vagrant box verwenden - zur Serverkonfiguration hinzufügen:Problemquelle: VirtualBox Bug
quelle
Dies kann auch passieren, wenn Sie Code aus einem anderen Dokument (z. B. einer PDF-Datei) in Ihre Konsole kopieren und versuchen, ihn auszuführen.
Ich habe versucht, einen Beispielcode aus einem Javascript-Buch auszuführen, das ich gerade lese, und war überrascht, dass es nicht in der Konsole ausgeführt wurde.
Anscheinend führt das Kopieren aus der PDF-Datei einige unerwartete, illegale und unsichtbare Zeichen in den Code ein.
quelle
Ich hatte das gleiche Problem auf meinem Mac und stellte fest, dass der Mac die Standardzitate durch geschweifte Anführungszeichen ersetzte, die illegale Javascript-Zeichen sind.
Um dies zu beheben, musste ich die Einstellungen auf meinem Mac ändern. Systemeinstellungen => Tastatur => Text (Registerkarte) Deaktivieren Sie die Option "Intelligente Anführungszeichen und Bindestriche verwenden" (Standardeinstellung wurde aktiviert).
quelle
Ich habe diesen Fehler in Chrome erhalten, als ich nach der Zeile, auf die der Fehler zeigte, eine nicht abgeschlossene Zeichenfolge hatte. Nach dem Schließen der Zeichenfolge wurde der Fehler behoben.
Beispiel mit Fehler:
Beispiel ohne Fehler:
quelle
Wenn Sie einen Vagabund für Nginx + Uwsgi-Setups ausführen, ist das Hauptproblem der Fehler in der virtuellen Box mit der Sendedatei, wie in einigen Antworten erwähnt. Um dies zu beheben, müssen Sie sendfile jedoch sowohl in nginx als auch in uwsgi deaktivieren.
In nginx.conf sendfile aus
uwsgi application / config --disable-sendfile
quelle
Unter OS X erstellt das Dateisystem versteckte Gabeln für praktisch alle Ihre Dateien, wenn diese sich auf einer Festplatte befinden, die HFS + nicht unterstützt. Dies kann manchmal (mir gerade passiert) dazu führen, dass Ihre JavaScript-Engine versucht, die Datengabel anstelle des Codes auszuführen, den Sie ausführen möchten. In diesem Fall erhalten Sie auch
weil der Datengabel Ihrer Datei das Unicode U + 200B-Zeichen enthält. Wenn Sie die Datengabel-Datei entfernen, führt Ihr Skript Ihren tatsächlichen, beabsichtigten Code anstelle einer binären Datengabel Ihres Codes aus.
quelle
Hier ist mein Grund:
Vor:
Das
\u
ist eine Flucht, ich habe es mit Codepen herausgefunden Analyse JS herausgefunden.nach:
und der Fehler behoben
quelle
Ich hatte das gleiche Problem und es trat auf, weil ich beim Hinzufügen von Code in einer Textzeichenfolge die Eingabetaste gedrückt hatte.
Da es sich um eine lange Textfolge handelte, wollte ich alles sehen, ohne in meinem Texteditor scrollen zu müssen. Durch Drücken der Eingabetaste wurde der Zeichenfolge jedoch ein unsichtbares Zeichen hinzugefügt, das illegal war. Ich habe Sublime Text als Editor verwendet.
quelle
Ich habe alle Raumbereiche einfach so auf & nbsp geändert und es hat problemlos funktioniert.
Ich hoffe es hilft jemandem.
quelle
Ich werde dem Stapel noch eine Antwort hinzufügen. Dieses Problem kann auch aufgrund der Codierung auftreten. Sie möchten, dass die utf8-Codierung auf der sicheren Seite ist. Einige Editoren verwenden standardmäßig utf16, was zu Problemen führen kann. Eine schnelle Möglichkeit, dies zu testen, besteht darin, beispielsweise im VS-Code einfach denselben Inhalt neu zu erstellen, aber die Datei mit dem lokalen Editor von vscode zu erstellen. Hoffe das hilft einigen.
quelle