Keine sichtbare Ursache für "Unerwartetes Token ILLEGAL"

270

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?

bfavaretto
quelle
9
Für zukünftige Leser: Wenn Sie bei der Verwendung von Vagrant auf diesen Fehler gestoßen sind, kann diese Antwort auch hilfreich sein: stackoverflow.com/questions/9479117/…
OZ_
Für den Fall, dass dies in WordPress auftritt, stellen Sie die Skripte aus der Datei functions.php in die Warteschlange. Ich hatte eine bestimmte Vorlage, in der ich die JS direkt aus der Vorlage heraus anrief. Das Wechseln zu einer bedingten Warteschlange in wp_head oder wp_footer hat dies behoben.
Alpesh Shah
7
Anmerkung des Moderators: Ich habe hier eine Reihe von Antworten gelöscht, die die Frage nicht wirklich beantworten. Dies ist nicht, ich wiederhole nicht einen Platz, jede mögliche Sache aufzulisten , die Sie in JavaScript tun können , die zu diesem Fehler führen wird. Die Frage hat einen sehr spezifischen Umstand, der keines dieser Szenarien betrifft, und all diese Beispiele beantworten die Frage einfach nicht .
Animuson
3
Wow, die SO-Polizei hatte einen Feldtag mit dieser Frage. Glücklicherweise sind einige der relevanten Informationen in den gelöschten Antworten noch sichtbar.
Cdonner

Antworten:

493

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 .

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.

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 bekannt ZWSPals HTML-Entität ​). Es ist bekannt, dass dieses Zeichen den Unexpected token ILLEGALJavaScript-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 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+200Beigenen 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 oder EnableSendfile OffApache 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.

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

ZWSPkann 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 ZWSPCSS-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+200Cund U+200D) in Abschnitt 7.1 erwähnt , in denen angegeben wird, dass sie IdentifierPartals "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+200Bdies 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.

bfavaretto
quelle
codepen.io scheint dieses Zeichen ebenfalls anzuzeigen. VIM und VI, auch Notepad ++ zeigt es an.
Rlemon
Danke @rlemon, der Antwort wurde ein CodePen-Beispiel hinzugefügt. Schöne Seite, ich wusste nichts davon.
Bfavaretto
Genau dieses Problem ist beim Kopieren / Einfügen von Code für die Klasse testTwo aus dieser SO-Frage mit Chromium aufgetreten . Anscheinend hat der Parser an der Syntaxhervorhebung des functionSchlü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 :))
ack
1
@bfavaretto, nur im Code-Snippet im Bearbeitungsmodus. Nicht im Hauptteil der Frage, hätte dies erwähnen sollen. (Getestet auf Chrome 43.0.2357.124 m)
Fernando Leal
1
Viele Texteditoren ermöglichen das Umschalten der Zeichenkodierung einer Datei. Dies ist äußerst nützlich, um solche beleidigenden Charaktere zu finden. Meine Lösung bestand darin, vorübergehend von UTF-8 zu einer ANSI-Codierung zu wechseln, die ungültigen Zeichen zu entfernen und dann zurückzuschalten. Ich habe die Freeware Notepad ++ unter Windows verwendet. BEARBEITEN: Es stellte sich heraus, dass ich die Notepad ++ - Option für "Alle Zeichen anzeigen" verpasst habe. Gleiches Ergebnis, weniger Ärger: D
mbargiel
64

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 nginxin vagrant box verwenden - zur Serverkonfiguration hinzufügen:

sendfile off;

Wenn Sie apachein vagrant box verwenden - zur Serverkonfiguration hinzufügen:

EnableSendfile Off;

Problemquelle: VirtualBox Bug

Nikolay Fominyh
quelle
6
Du hast mir buchstäblich den Tag gerettet. Ich habe einen ganzen Abend mit Nginx + Vagrant gekämpft, und das hat es gelöst.
Fradeve
2
Ich habe NICHT erwartet, dass dies die richtige Antwort ist (für mich), aber es war, vielen Dank.
Charlotte
2
Eigentlich hat es aufgehört zu funktionieren. Andererseits spielen hier mehrere Ebenen der Symlinking-Funktion eine Rolle, sodass ich einfach rückgängig gemacht habe, was ich konnte.
Charlotte
Danke - ich war mit Nginx in einer Vagabundkiste. Ich habe dieses Problem auch bei ähnlichen Apache-Setups gesehen.
Cameron
für Apache: EnableSendfile Off
Jamlee
7

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.

Kyle Pennell
quelle
5

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

user3360944
quelle
5

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>";
Ozzy
quelle
2
Ich musste Ihre beiden Beispiele differenzieren, um den Unterschied herauszufinden, und als ich das tat, fand ich sofort mein eigenes Problem heraus.
Ben Harold
3

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.

  1. In nginx.conf sendfile aus

  2. uwsgi application / config --disable-sendfile

msrivas
quelle
2

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

Spcaeyob
quelle
1

Hier ist mein Grund:

Vor:

var path = "D:\xxx\util.s"

Das \uist eine Flucht, ich habe es mit Codepen herausgefunden Analyse JS herausgefunden.

nach:

var path = "D:\\xxx\\util.s"

und der Fehler behoben

Miao1007
quelle
0

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.

Jordan Davis
quelle
0

Ich habe alle Raumbereiche einfach so auf & nbsp geändert und es hat problemlos funktioniert.

val.replace ("", "& nbsp");

Ich hoffe es hilft jemandem.

Erdogan
quelle
0

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.

rezeli
quelle