コンソールで次のJavaScriptエラーが発生します。
キャッチされないSyntaxError:予期しないトークンILLEGAL
これは私のコードです:
var foo = 'bar';
ご覧のとおり、とてもシンプルです。構文エラーの原因は何ですか?
コンソールで次のJavaScriptエラーが発生します。
キャッチされないSyntaxError:予期しないトークンILLEGAL
これは私のコードです:
var foo = 'bar';
ご覧のとおり、とてもシンプルです。構文エラーの原因は何ですか?
回答:
JavaScriptインタプリタによってコードが解析されると、コードは「トークン」と呼ばれる断片に分解されます。トークンを4つの基本的なトークンタイプのいずれかに分類できない場合、ほとんどの実装で「不正」というラベルが付けられ、このエラーがスローされます。
たとえば、不正な@
文字、中かっこ、ブラケット、「スマートクォート」、単一引用符が適切に囲まれていない(例:)などの不正な文字でjsファイルを実行しようとすると、同じエラーが発生this.run('dev1)
します。
このエラーはさまざまな状況で発生する可能性があります。ただし、明らかな構文エラーや不正な文字がない場合は、目に見えない不正な文字が原因である可能性があります。それがこの答えについてです。
コードのセミコロンの直後に非表示の文字があります。これは、UnicodeのU+200B
ゼロ幅スペース文字(別名ZWSP
、HTMLエンティティ​
)です。その文字はUnexpected token ILLEGAL
JavaScript構文エラーの原因となることがわかっています。
確かではありませんが、私の賭けはjsfiddleにあります。そこからコードを貼り付けると、1つ以上のU+200B
文字が含まれる可能性が高くなります。ツールはその文字を使用して長い文字列のワードラップを制御しているようです。
2013年1月7日更新
最新の後jsfiddle更新、赤い点として、それは今の文字を見せて codepenなどはありません。どうやら、それ
U+200B
自体で文字を挿入することもなくなったので、この問題は今後あまり発生しないはずです。2015年3月17日更新
VirtualBoxのバグのため、Vagrantがこの問題を引き起こすこともあります。ごとなどの溶液、このブログの記事は、セットにある
sendfile off;
、あなたのnginxの設定で、またはEnableSendfile Off
Apacheを使用している場合。
Chromeデベロッパーツールから貼り付けたコードにその文字が含まれている可能性があることも報告されていますが、現在のバージョン(OSXでは22.0.1229.79)では再現できませんでした。
キャラクターは見えませんが、そこにあることをどうやって知るのですか?編集者に見えない文字を表示するように依頼できます。ほとんどのテキストエディタにはこの機能があります。たとえば、Vimはデフォルトでそれらを表示し、ZWSP
番組はとして表示されます<u200b>
。オンラインでデバッグすることもできます。jsbinは、コードペインに文字を赤いドットとして表示します(ただし、ページを保存して再ロードすると、文字が削除されるようです)。CodePen.ioもそれをドットとして表示し、保存後も保持します。
そのキャラクターは悪いものではありません、それは実際には非常に便利です。ウィキペディアのこの例は、長い文字列を次の行に折り返す場所を制御するためにどのように使用できるかを示しています。ただし、マークアップでのキャラクターの存在を知らない場合は、問題になる可能性があります。文字列の内部にある場合(たとえば、nodeValue
コンテンツが表示されていないDOM要素の)、実際には空ではない場合でも(を適用した後でもString.trim
)そのような文字列は空であると期待できます。
ZWSP
また、HTMLページに余分な空白が表示される場合もあります(たとえば、2つの<div>
要素の間にある場合(この質問で見られるように)。)このケースは、キャラクターが無視されるため、jsfiddleでは再現できません。
別の潜在的な問題:WebページのエンコーディングがUTF-8として認識されない場合、文字が実際に表示されることがあります(​
たとえば、latin1の場合)。
ZWSP
CSSコード(インラインコード、または外部スタイルシート)に存在する場合、スタイルも適切に解析できないため、一部のスタイルは適用されません(この質問で見られるように)。
ECMAScript仕様(バージョン3および5.1)でその特定の文字についての言及は見つかりませんでした。現在のバージョンでは、セクション7.1で同様の文字(U+200C
およびU+200D
)について言及しています。これは、「コメント、文字列リテラル、および正規表現リテラル以外」ではs として扱う必要があることを示しています。これらの文字は、たとえば、変数名の一部である可能性があります(実際に機能します)。IdentifierPart
var x\u200c;
セクション7.2は、有効な空白文字(タブ、スペース、ノーブレークスペースなど)をリストし、その他のUnicode「スペース区切り文字」(カテゴリ「Z」)は空白として扱われるべきであると漠然と述べています。私はおそらくこの点で仕様を議論するのに最高の人でU+200B
はありませんが、実際には実装(少なくともChromeとFirefox)がそれらを予期しないものとして扱うように見える場合、それに従って空白と見なされるべきだと私には思われますトークン(またはその一部)。構文エラーを引き起こします。
なぜこの問題をコードに探したのですか?たとえコピーペーストされたとしても。
あなたが見ることができるならば、同期フォルダにファイルを保存した後に正確に何が起こっているか-あなたは*****
ファイルの終わりのようなものを見るでしょう。コードとはまったく関係ありません。
解決。
nginx
vagrant boxで使用している場合-サーバー構成に追加:
sendfile off;
apache
vagrant boxで使用している場合-サーバー構成に追加:
EnableSendfile Off;
問題の原因:VirtualBoxバグ
Macでも同じ問題があり、Macが標準の引用符を、不正なJavaScript文字である中括弧で置き換えていたことが原因であることがわかりました。
これを修正するには、Macの設定を変更する必要がありました。システム環境設定=>キーボード=>テキスト(タブ)のチェックを外して、スマートクォートとダッシュを使用します(デフォルトではオンになっています)。
エラーが指す行の後に終了していない文字列があると、Chromeでこのエラーが発生しました。文字列を閉じた後、エラーはなくなりました。
エラーのある例:
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>";
エラーなしの例:
var file = files[i]; // No error
jQuery('#someDiv').innerHTML = file.name + " (" + formatSize(file.size) + ") "
+ "<a href=\"javascript: something('"+file.id+"');\">Error was here</a>";
OS Xを実行している場合、ファイルシステムは、HFS +をサポートしていないハードドライブにある場合、基本的にすべてのファイルの隠しフォークを作成します。これは時々(ちょうど今起こっていることですが)、JavaScriptエンジンが実行しようとしているコードの代わりにデータフォークを実行しようとする可能性があります。これが発生すると、あなたも受け取ります
SyntaxError: Unexpected token ILLEGAL
ファイルのデータフォークにUnicode U + 200B文字が含まれるためです。データフォークファイルを削除すると、スクリプトは、コードのバイナリデータフォークではなく、実際の目的のコードを実行します。
。何でも:これらのファイルは、完全なHFSファイル特性をネイティブでサポートしていないボリューム(たとえば、ufsボリューム、Windowsファイル共有など)に作成されます。Macファイルがそのようなボリュームにコピーされると、そのデータフォークはファイルの通常の名前で保存され、追加のHFS情報(リソースフォーク、タイプおよびクリエーターコードなど)は2番目のファイル(AppleDouble形式)に保存されます。 「。」で始まる名前 (もちろん、これらのファイルはOS-Xに関しては見えませんが、他のOSからは見えません。これは時々煩わしいかもしれません...)
これと同じ問題があり、テキスト文字列にコードを追加するときにEnterキーを押したために発生しました。
これは長いテキスト文字列だったので、テキストエディターでスクロールせずにすべて表示したかったのですが、Enterキーを押すと文字列に非表示の文字が追加され、違法でした。私はエディターとしてSublime Textを使用していました。