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?
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?
Antworten:
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 .
Viele verschiedene Situationen können diesen Fehler verursachen. Wenn Sie jedoch keinen offensichtlichen Syntaxfehler oder ein unzulässiges Zeichen haben, kann dies durch ein unsichtbares unzulässiges Zeichen verursacht werden. Darum geht es in dieser Antwort.
Der Code enthält direkt nach dem Semikolon ein unsichtbares Zeichen. Es ist der Unicode U+200B
-Raum mit der Breite Null (auch bekannt ZWSP
als HTML-Entität ​
). Es ist bekannt, dass dieses Zeichen den Unexpected token ILLEGAL
JavaScript-Syntaxfehler verursacht.
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 sindU+200B
Zeichen enthalten sind. Es scheint, dass das Tool dieses Zeichen verwendet, um das Umbrechen von Wörtern in langen Zeichenfolgen zu steuern.
UPDATE 07.01.2013
Nach dem letzten jsfiddle-Update wird das Zeichen jetzt wie ein Codepen als roter Punkt angezeigt. Anscheinend werden auch keine
U+200B
eigenen Zeichen mehr eingefügt, sodass dieses Problem von nun an weniger häufig auftreten sollte.UPDATE 17.03.2015
Vagrant scheint dieses Problem aufgrund eines Fehlers in VirtualBox manchmal auch zu verursachen . Die Lösung gemäß diesem Blog-Beitrag besteht darin,
sendfile off;
in Ihrer Nginx-Konfiguration festzulegen oderEnableSendfile Off
Apache zu verwenden.
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.
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.
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 Anwenden String.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 ).
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
und U+200D
) in Abschnitt 7.1 erwähnt , in denen angegeben wird, dass sie IdentifierPart
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 (und var 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.
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:
sendfile off;
Wenn Sie apache
in vagrant box verwenden - zur Serverkonfiguration hinzufügen:
EnableSendfile Off;
Problemquelle: VirtualBox Bug
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.
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).
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:
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>";
Beispiel ohne Fehler:
var file = files[i]; // No error
jQuery('#someDiv').innerHTML = file.name + " (" + formatSize(file.size) + ") "
+ "<a href=\"javascript: something('"+file.id+"');\">Error was here</a>";
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
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
SyntaxError: Unexpected token ILLEGAL
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.
.Was auch immer: Diese Dateien werden auf Volumes erstellt, die nicht vollständig die vollständigen HFS-Dateieigenschaften unterstützen (z. B. UFS-Volumes, Windows-Dateifreigaben usw.). Wenn eine Mac-Datei auf ein solches Volume kopiert wird, wird ihr Datengabel unter dem regulären Namen der Datei gespeichert, und die zusätzlichen HFS-Informationen (Ressourcengabel, Typ- und Erstellercodes usw.) werden in einer zweiten Datei (im AppleDouble-Format) gespeichert. mit einem Namen, der mit ". " beginnt . (Diese Dateien sind für OS-X natürlich unsichtbar, aber nicht für andere Betriebssysteme. Dies kann manchmal ärgerlich sein ...)
Hier ist mein Grund:
Vor:
var path = "D:\xxx\util.s"
Das \u
ist eine Flucht, ich habe es mit Codepen herausgefunden Analyse JS herausgefunden.
nach:
var path = "D:\\xxx\\util.s"
und der Fehler behoben
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.
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.