「予期しないトークンILLEGAL」の明白な原因はありません


270

コンソールで次のJavaScriptエラーが発生します。

キャッチされないSyntaxError:予期しないトークンILLEGAL

これは私のコードです:

var foo = 'bar';​

ご覧のとおり、とてもシンプルです。構文エラーの原因は何ですか?


9
将来の読者のために:ベイグラントを使用しているときにこのエラーが発生した場合-この回答も参考にすることができ:stackoverflow.com/questions/9479117/...
OZ_

WordPressでこれが発生している場合は、functions.phpからスクリプトをエンキューします。テンプレートから直接JSを呼び出す特定のテンプレートがありました。wp_headまたはwp_footerのいずれかで条件付きエンキューに切り替えると、これが解決しました。
Alpesh Shah 2014

7
モデレーターのメモ:実際には質問に回答しない多数の回答をここで削除しました。これは私が繰り返し、ないない、このエラーになりますが、JavaScriptで行うことができるすべての可能なものをリストアップする場所を。質問には、これらのシナリオのいずれも含まない非常に特殊な状況があり、これらのすべての例は単に質問に答えません
アニムソン

3
うわー、SO警察はこの質問で野戦の日を過ごしました。幸いにも、削除された回答には関連情報の一部がまだ表示されています。
cdonner 2015

回答:


493

エラー

JavaScriptインタプリタによってコードが解析されると、コードは「トークン」と呼ばれる断片に分解されます。トークンを4つの基本的なトークンタイプのいずれかに分類できない場合、ほとんどの実装で「不正」というラベルが付けられ、このエラーがスローされます。

たとえば、不正な@文字、中かっこ、ブラケット、「スマートクォート」、単一引用符が適切に囲まれていない(例:)などの不正な文字でjsファイルを実行しようとすると、同じエラーが発生this.run('dev1)します。

このエラーはさまざまな状況で発生する可能性があります。ただし、明らかな構文エラーや不正な文字がない場合は、目に見えない不正な文字が原因である可能性があります。それがこの答えについてです。

しかし、私は何も違法を見ることはできません!

コードのセミコロンの直後に非表示の文字があります。これは、UnicodeのU+200Bゼロ幅スペース文字(別名ZWSP、HTMLエンティティ​)です。その文字はUnexpected token ILLEGALJavaScript構文エラーの原因となることがわかっています。

そしてそれはどこから来たのですか?

確かではありませんが、私の賭けはjsfiddleにあります。そこからコードを貼り付けると、1つ以上のU+200B文字が含まれる可能性が高くなります。ツールはその文字を使用して長い文字列のワードラップを制御しているようです。

2013年1月7日更新

最新の後jsfiddle更新赤い点として、それは今の文字を見せて codepenなどはありません。どうやら、それU+200B自体で文字を挿入することもなくなったので、この問題は今後あまり発生しないはずです。

2015年3月17日更新

VirtualBoxのバグのため、Vagrantがこの問題を引き起こすこともあります。ごとなどの溶液、このブログの記事は、セットにあるsendfile off;、あなたのnginxの設定で、またはEnableSendfile OffApacheを使用している場合。

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の場合)。

ZWSPCSSコード(インラインコード、または外部スタイルシート)に存在する場合、スタイルも適切に解析できないため、一部のスタイルは適用されません(この質問で見られるように)。

ECMAScript仕様

ECMAScript仕様(バージョン3および5.1)でその特定の文字についての言及は見つかりませんでした。現在のバージョンでは、セクション7.1で同様の文字(U+200CおよびU+200D)について言及しています。これは、「コメント、文字列リテラル、および正規表現リテラル以外」ではs として扱う必要があることを示しています。これらの文字は、たとえば、変数名の一部である可能性があります(実際に機能します)。IdentifierPartvar x\u200c;

セクション7.2は、有効な空白文字(タブ、スペース、ノーブレークスペースなど)をリストし、その他のUnicode「スペース区切り文字」(カテゴリ「Z」)は空白として扱われるべきであると漠然と述べています。私はおそらくこの点で仕様を議論するのに最高の人でU+200Bはありませんが、実際には実装(少なくともChromeとFirefox)がそれらを予期しないものとして扱うように見える場合、それに従って空白と見なされるべきだと私には思われますトークン(またはその一部)。構文エラーを引き起こします。


codepen.ioもこの文字を表示しているようです。VIMおよびVI、notepad ++でも表示されます。
rlemon

@rlemonに感謝し、CodePenの例を回答に追加しました。いいサイト、知らなかった。
bfavaretto 2012年

このSOの質問からChromiumを使用してtestTwoクラスのコードをコピー/貼り付けしているときに、この問題にぶつかりました。どうやら、パーサーはfunctionキーワードの構文の強調表示を窒息させました。これは、「印刷できない文字をすべて強調表示する」FAQメソッドを使用して強調表示するまで、Vimには表示されませんでした。ああ、32..127の範囲の文字だけをコピーする方法があったら、それはとても素晴らしいでしょう(しかし、おそらくそのためのアプリがあるでしょう:))
ack

1
@bfavaretto、編集モードのコードスニペットのみ。質問の本文ではなく、これについて言及すべきでした。(Chrome 43.0.2357.124 mでテスト済み)
Fernando Leal

1
多くのテキストエディタでは、ファイルの文字エンコーディングを切り替えることができます。これは、このような問題のある文字を見つけるのに非常に役立ちます。私の解決策は、一時的にUTF-8からANSIエンコーディングに切り替え、無効な​​文字を削除して、元に戻すことでした。WindowsではフリーウェアのNotepad ++を使用しました。編集:「すべての文字を表示する」のNotepad ++オプションを逃したことがわかりました。同じ結果、手間の
軽減

64

なぜこの問題をコードに探したのですか?たとえコピーペーストされたとしても。

あなたが見ることができるならば、同期フォルダにファイルを保存した後に正確に何が起こっているか-あなたは*****ファイルの終わりのようなものを見るでしょう。コードとはまったく関係ありません。

解決。

nginxvagrant boxで使用している場合-サーバー構成に追加:

sendfile off;

apachevagrant boxで使用している場合-サーバー構成に追加:

EnableSendfile Off;

問題の原因:VirtualBoxバグ


6
あなたは文字通り私の日を救った。Nginx + Vagrantと一晩中苦労してきましたが、これで解決しました。
fradeve 14

2
これが正しい答えだとは思っていませんでした(私にとって)が、そうでした。
シャーロット

2
実際には、動作しなくなりました。次に、ここにもシンボリックリンクの複数のレイヤーがあるので、できることを元に戻しました。
シャーロット

おかげで-私はnginxの浮浪者の箱にいました。この問題は、同様のApacheセットアップでも見られます。
Cameron

Apacheの場合:EnableSendfile Off
jamlee 2016年

7

これは、別のドキュメント(PDFなど)からコンソールにコードをコピーして実行しようとした場合にも発生する可能性があります。

私が読んでいるJavascriptの本からいくつかのサンプルコードを実行しようとしていましたが、コンソールで実行できないことに驚いていました。

どうやら、PDFからコピーすると、予期しない、違法な、目に見えない文字がコードに導入されます。


5

Macでも同じ問題があり、Macが標準の引用符を、不正なJavaScript文字である中括弧で置き換えていたことが原因であることがわかりました。

これを修正するには、Macの設定を変更する必要がありました。システム環境設定=>キーボード=>テキスト(タブ)のチェックを外して、スマートクォートとダッシュを使用します(デフォルトではオンになっています)。


5

エラーが指す行の後に終了していない文字列があると、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>";

2
私は違いを理解するためにあなたの2つの例でdiffを実行しなければなりませんでした。
Ben Harold、

3

nginx + uwsgiセットアップバグラントを実行している場合、主な問題は、いくつかの回答で述べられているように、送信ファイルの仮想ボックスのバグです。ただし、それを解決するには、nginxとuwsgiの両方でsendfileを無効にする必要があります。

  1. nginx.confでsendfile off

  2. uwsgiアプリケーション/ config --disable-sendfile


2

OS Xを実行している場合、ファイルシステムは、HFS +をサポートしていないハードドライブにある場合、基本的にすべてのファイルの隠しフォークを作成します。これは時々(ちょうど今起こっていることですが)、JavaScriptエンジンが実行しようとしているコードの代わりにデータフォークを実行しようとする可能性があります。これが発生すると、あなたも受け取ります

SyntaxError: Unexpected token ILLEGAL

ファイルのデータフォークにUnicode U + 200B文字が含まれるためです。データフォークファイルを削除すると、スクリプトは、コードのバイナリデータフォークではなく、実際の目的のコードを実行します。

何でも:これらのファイルは、完全なHFSファイル特性をネイティブでサポートしていないボリューム(たとえば、ufsボリューム、Windowsファイル共有など)に作成されます。Macファイルがそのようなボリュームにコピーされると、そのデータフォークはファイルの通常の名前で保存され、追加のHFS情報(リソースフォーク、タイプおよびクリエーターコードなど)は2番目のファイル(AppleDouble形式)に保存されます。 「。で始まる名前 (もちろん、これらのファイルはOS-Xに関しては見えませんが、他のOSからは見えません。これは時々煩わしいかもしれません...)


1

これが私の理由です:

前:

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

これ\uはエスケープです。Codepenの分析JS を使用して、それを理解しました。

後:

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

そしてエラーは修正されました


0

これと同じ問題があり、テキスト文字列にコードを追加するときにEnterキーを押したために発生しました。

これは長いテキスト文字列だったので、テキストエディターでスクロールせずにすべて表示したかったのですが、Enterキーを押すと文字列に非表示の文字が追加され、違法でした。私はエディターとしてSublime Textを使用していました。


0

私はすべてのスペース領域を&nbspに変更しましたが、それは問題なく動作しました。

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

誰かのお役に立てば幸いです。


0

もう1つ答えを山に追加します。この問題は、エンコードのためにも発生する可能性があります。utf8エンコーディングを安全にしたい。一部のエディターはデフォルトでutf16を使用しているため、問題が発生する可能性があります。これをテストする1つの簡単な方法は、たとえばVSコードで、同じコンテンツを再作成するだけですが、vscodeのローカルエディターを使用してファイルを作成します。これが一部に役立つことを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.