I'm mendapatkan ini JavaScript error pada console:
Tertangkap SyntaxError: Unexpected token ILEGAL
Ini kode saya:
var foo = 'bar';
It's super sederhana, seperti yang anda lihat. Bagaimana hal itu bisa menyebabkan syntax error?
Ketika kode diurai oleh JavaScript penerjemah, itu akan dipecah menjadi potongan-potongan yang disebut "token". Ketika token tidak dapat diklasifikasikan ke dalam salah satu [empat dasar token jenis][13], itu akan berlabel "ILEGAL" pada sebagian besar implementasi, dan kesalahan ini dilemparkan.
Kesalahan yang sama dinaikkan jika, misalnya, anda mencoba untuk menjalankan file js dengan nakal @
karakter, salah penjepit keriting, bracket, "kutipan pintar", tanda kutip tunggal tidak tertutup dengan benar (misalnya ini.menjalankan('dev1)
) dan sebagainya.
banyak situasi Yang berbeda dapat menyebabkan kesalahan ini. Tapi jika anda don't memiliki jelas kesalahan sintaks atau karakter ilegal, hal ini dapat disebabkan oleh terlihat karakter ilegal. Yang's apa jawaban ini adalah tentang.
Tapi aku bisa't melihat sesuatu yang ilegal!
Ada invisible karakter dalam kode, tepat setelah titik koma. It's Unicode
U+200B
Nol-lebar ruang karakter (a.k.a.ZWSP
, entitas HTML​
). Karakter yang dikenal untuk menyebabkanUnexpected token ILEGAL
JavaScript syntax error.Dan dari mana datangnya?
Saya dapat't tahu pasti, tapi saya yakin pada [jsfiddle][2]. Jika anda paste kode dari sana, it's sangat mungkin mencakup satu atau lebih
U+200B
karakter. Tampaknya alat ini menggunakan karakter itu untuk mengontrol kata-pembungkus string panjang. UPDATE 2013-01-07Setelah terbaru jsfiddle update, [it's sekarang menunjukkan karakter seperti red dot][jsfiddle-demo] suka codepen tidak. Sepertinya, it's juga tidak memasukkan
U+200B
karakter sendiri lagi, jadi masalah ini harus kurang sering dari sekarang. UPDATE 2015-03-17Gelandangan tampaknya kadang-kadang menyebabkan masalah ini juga, karena bug di VirtualBox. Solusinya, sesuai blog ini post adalah untuk mengatur
sendfile off;
di nginx, atauEnableSendfile Off
jika anda menggunakan Apache. It's juga telah dilaporkan kode yang disisipkan dari Chrome developer tools dapat mencakup karakter itu, tapi aku tidak mampu untuk mereproduksi bahwa dengan versi terbaru (22.0.1229.79 di OSX).Bagaimana saya bisa menemukannya?
Karakter tidak terlihat, lakukan bagaimana kita tahu itu's ada? Anda dapat meminta teman-editor untuk menunjukkan karakter yang tidak terlihat. Editor teks yang paling memiliki fitur ini. Vim, misalnya, menampilkan mereka secara default, dan
ZWSP
menunjukkan<u200b>
. Anda juga dapat debug online: jsbin menampilkan karakter sebagai titik merah pada kode panel (tapi tampaknya untuk menghapusnya setelah menyimpan dan reload halaman). CodePen.io juga menampilkannya sebagai dot, dan terus bahkan setelah menyimpan.Masalah yang berkaitan dengan
Karakter itu adalah bukan sesuatu yang buruk, itu benar-benar dapat menjadi sangat berguna. Contoh ini di Wikipedia menunjukkan bagaimana hal itu dapat digunakan untuk mengontrol di mana tali panjang harus dibungkus ke baris berikutnya. Namun, jika anda tidak menyadari karakter's kehadiran di markup anda, hal itu mungkin menjadi masalah. Jika anda memiliki itu dalam sebuah string (misalnya,
nodeValue
dari elemen DOM yang tidak memiliki konten terlihat), anda mungkin berharap seperti string kosong, padahal sebenarnya itu's tidak (bahkan setelah menerapkanString.trim
).ZWSP
juga dapat menyebabkan spasi tambahan yang akan ditampilkan pada halaman HTML, sebagai contoh ketika itu's ditemukan antara dua<div>
unsur-unsur (seperti yang terlihat pada pertanyaan). Kasus ini bahkan tidak direproduksi di jsfiddle, karena karakter yang diabaikan di sana. Masalah lain yang potensial: jika halaman web's encoding tidak diakui sebagai UTF-8, karakter mungkin benar-benar akan ditampilkan (sebagaiâ€"
di latin1, misalnya). JikaZWSP
hadir pada kode CSS (kode inline, atau eksternal stylesheet), gaya juga dapat tidak dapat diurai dengan baik, sehingga beberapa gaya don't mendapatkan diterapkan (seperti yang terlihat pada pertanyaan).ECMAScript Spesifikasi
Saya tidak't menemukan penyebutan bahwa karakter tertentu pada ECMAScript Spesifikasi (versi 3 dan 5.1). Versi saat ini menyebutkan karakter yang sama (
U+200C
danU+200D
) pada Bagian 7.1, yang mengatakan mereka harus diperlakukan sebagaiIdentifierPart ketika "di luar komentar, string literal, dan ekspresi reguler literal". Karakter-karakter yang mungkin, misalnya, menjadi bagian dari sebuah nama variabel (dan
var x\u200c;memang bekerja). [Bagian 7.2][8] daftar valid karakter spasi (seperti tab, ruang, ada ruang istirahat, dll.), dan samar-samar menyebutkan bahwa setiap Unicode lainnya "ruang pemisah" (kategori "Zs") harus diperlakukan sebagai ruang putih. I'm mungkin bukan orang terbaik untuk membahas spesifikasi dalam hal ini, tapi tampaknya bagi saya bahwa
U+200B` harus dipertimbangkan ruang putih menurut yang, ketika pada kenyataannya implementasi (setidaknya Chrome dan Firefox) muncul untuk memperlakukan mereka sebagai tak terduga token (atau bagian dari satu), menyebabkan syntax error.
mengapa kau mencari masalah ini ke kode anda? Bahkan, jika itu's copypasted.
Jika anda dapat melihat, apa yang sebenarnya terjadi setelah menyimpan file di disinkronkan folder - anda akan melihat sesuatu seperti *****
pada akhir file. It's tidak terkait dengan kode anda di semua.
Solusi.
Jika anda menggunakan nginx
di kotak gelandangan - tambahkan ke server config:
sendfile off;
Jika anda menggunakan apache
di kotak gelandangan - tambahkan ke server config:
EnableSendfile Off;
Sumber masalah: VirtualBox Bug
Ini juga bisa terjadi jika anda're menyalin kode dari dokumen lain (seperti PDF) ke konsol anda dan mencoba untuk menjalankannya.
Saya mencoba untuk menjalankan beberapa contoh kode Javascript buku I'm membaca dan terkejut itu didn't berjalan di konsol.
Rupanya, menyalin dari PDF memperkenalkan beberapa tak terduga, ilegal, dan tidak terlihat karakter ke kode.
Aku punya kesalahan ini di chrome ketika saya memiliki unterminated string setelah baris yang error menunjuk ke. Setelah penutupan string error pergi.
Misalnya dengan kesalahan:
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>";
Contoh tanpa kesalahan:
var file = files[i]; // No error
jQuery('#someDiv').innerHTML = file.name + " (" + formatSize(file.size) + ") "
+ "<a href=\"javascript: something('"+file.id+"');\">Error was here</a>";
Aku punya masalah yang sama pada mac saya dan menemukan hal itu karena Mac adalah mengganti standar kutipan dengan tanda petik yang ilegal javascript karakter.
Untuk memperbaiki hal ini aku harus mengubah pengaturan di mac System Preferences=>Keyboard=>Teks(tab) hapus centang gunakan smart kutipan dan tanda hubung (default diperiksa).
Jika anda menjalankan nginx + uwsgi setup gelandangan maka masalah utama adalah Virtual box bug dengan mengirim file seperti yang disebutkan dalam beberapa jawaban. Namun untuk mengatasinya anda harus menonaktifkan sendfile di kedua nginx dan uwsgi.
Di nginx.conf sendfile off
uwsgi application / config --disable-sendfile
Ketika menjalankan OS X, filesystem menciptakan tersembunyi garpu pada dasarnya semua file anda, jika mereka berada di hard drive yang doesn't dukungan HFS+. Hal ini dapat kadang-kadang (terjadi padaku sekarang) menyebabkan mesin JavaScript mencoba untuk menjalankan data-garpu, bukan kode yang anda berniat untuk menjalankan. Ketika ini terjadi, anda juga akan menerima
SyntaxError: Unexpected token ILLEGAL
karena data garpu file anda akan berisi Unicode U+200B karakter. Menghapus data garpu file akan membuat naskah anda menjalankan anda yang sebenarnya, dimaksudkan kode, alih-alih data biner garpu dari kode anda.
.whatever : file-file Ini dibuat pada volume yang don't native mendukung penuh file HFS karakteristik (misalnya ufs volume, Windows fileshares, dll). Ketika Mac file yang disalin untuk volume tersebut, data garpu disimpan dalam file's regular nama, dan tambahan HFS informasi (sumber daya garpu, jenis & pencipta kode, dll) disimpan di file kedua (di AppleDouble format), dengan nama yang dimulai dengan ".". (File ini, tentu saja, tak terlihat sejauh OS-X yang bersangkutan, tapi tidak untuk OS lain's; ini kadang-kadang dapat mengganggu...)
Aku punya masalah yang sama dan itu terjadi karena saya sudah tekan enter ketika menambahkan kode dalam string teks.
Karena itu adalah panjang string teks aku ingin melihat itu semua tanpa harus gulir di editor teks saya, namun menekan enter menambahkan tak terlihat karakter string yang ilegal. Saya menggunakan Sublime Text sebagai editor.