Saya mendapatkan kesalahan JavaScript ini di konsol saya:
Uncaught SyntaxError: Token tak terduga ILLEGAL
Ini kode saya:
var foo = 'bar';
Ini sangat sederhana, seperti yang Anda lihat. Bagaimana bisa menyebabkan kesalahan sintaksis?
Saya mendapatkan kesalahan JavaScript ini di konsol saya:
Uncaught SyntaxError: Token tak terduga ILLEGAL
Ini kode saya:
var foo = 'bar';
Ini sangat sederhana, seperti yang Anda lihat. Bagaimana bisa menyebabkan kesalahan sintaksis?
Jawaban:
Ketika kode diuraikan oleh penerjemah JavaScript, kode tersebut akan dipecah menjadi beberapa bagian yang disebut "token". Ketika token tidak dapat diklasifikasikan ke dalam salah satu dari empat tipe token dasar , itu diberi label "ILLEGAL" pada sebagian besar implementasi, dan kesalahan ini dilemparkan.
Kesalahan yang sama muncul jika, misalnya, Anda mencoba menjalankan file js dengan @
karakter nakal , kurung kurawal yang salah tempat, braket, "tanda kutip pintar", tanda kutip tunggal tidak terlampir dengan benar (misalnya this.run('dev1)
) dan sebagainya.
Banyak situasi berbeda dapat menyebabkan kesalahan ini. Tetapi jika Anda tidak memiliki kesalahan sintaksis yang jelas atau karakter ilegal, itu mungkin disebabkan oleh karakter ilegal yang tidak terlihat . Itulah jawaban tentang ini.
Ada karakter yang tidak terlihat dalam kode, tepat setelah titik koma. Ini adalah karakter Unicode U+200B
Zero-width space (alias ZWSP
, entitas HTML ​
). Karakter itu diketahui menyebabkan Unexpected token ILLEGAL
kesalahan sintaksis JavaScript.
Saya tidak tahu pasti, tapi taruhan saya ada di jsfiddle . Jika Anda menempelkan kode dari sana, sangat mungkin untuk memasukkan satu atau lebih U+200B
karakter. Tampaknya alat menggunakan karakter itu untuk mengontrol pembungkus kata pada string panjang.
UPDATE 2013-01-07
Setelah pembaruan jsfiddle terbaru , sekarang menunjukkan karakter sebagai titik merah seperti codepen. Rupanya , itu juga tidak memasukkan
U+200B
karakter sendiri, jadi masalah ini harus lebih jarang dari sekarang.UPDATE 2015-03-17
Vagrant tampaknya terkadang menyebabkan masalah ini juga, karena bug di VirtualBox . Solusinya, sesuai posting blog ini adalah untuk mengatur
sendfile off;
konfigurasi nginx Anda, atauEnableSendfile Off
jika Anda menggunakan Apache.
Juga telah dilaporkan bahwa kode yang disisipkan dari alat pengembang Chrome dapat menyertakan karakter itu, tetapi saya tidak dapat mereproduksinya dengan versi saat ini (22.0.1229.79 pada OSX).
Karakternya tidak terlihat, apakah kita tahu itu ada di sana? Anda dapat meminta editor untuk menampilkan karakter yang tidak terlihat. Sebagian besar editor teks memiliki fitur ini. Vim, misalnya, menampilkannya secara default, dan ZWSP
menunjukkan sebagai <u200b>
. Anda juga dapat men-debug secara online: jsbin menampilkan karakter sebagai titik merah di panel kode (tetapi tampaknya menghapusnya setelah menyimpan dan memuat ulang halaman). CodePen.io juga menampilkannya sebagai titik , dan menyimpannya bahkan setelah disimpan.
Karakter itu bukan sesuatu yang buruk, sebenarnya bisa sangat berguna. Contoh ini di Wikipedia menunjukkan bagaimana itu dapat digunakan untuk mengontrol di mana string panjang harus dibungkus ke baris berikutnya. Namun, jika Anda tidak mengetahui keberadaan karakter di markup Anda, itu mungkin menjadi masalah. Jika Anda memilikinya di dalam string (misalnya, nodeValue
elemen DOM yang tidak memiliki konten yang terlihat), Anda mungkin mengharapkan string tersebut menjadi kosong, padahal sebenarnya tidak (bahkan setelah menerapkan String.trim
).
ZWSP
juga dapat menyebabkan spasi kosong ditampilkan pada halaman HTML, misalnya ketika ditemukan di antara dua <div>
elemen (seperti yang terlihat pada pertanyaan ini ). Kasus ini bahkan tidak dapat direproduksi pada jsfiddle, karena karakternya diabaikan di sana.
Masalah potensial lain: jika pengkodean halaman web tidak dikenali sebagai UTF-8, karakter sebenarnya dapat ditampilkan (seperti ​
dalam latin1, misalnya).
Jika ZWSP
ada pada kode CSS (kode inline, atau lembar gaya eksternal), gaya juga tidak dapat diuraikan dengan benar, sehingga beberapa gaya tidak diterapkan (seperti terlihat pada pertanyaan ini ).
Saya tidak dapat menemukan penyebutan karakter tertentu pada Spesifikasi Naskah ECMAS (versi 3 dan 5.1 ). Versi saat ini menyebutkan karakter yang sama ( U+200C
dan U+200D
) pada Bagian 7.1 , yang mengatakan mereka harus diperlakukan sebagai IdentifierPart
"ketika di luar komentar, string literal, dan literal ekspresi reguler". Karakter-karakter tersebut dapat, misalnya, menjadi bagian dari nama variabel (dan var x\u200c;
memang berfungsi).
Bagian 7.2 mencantumkan karakter spasi Putih yang valid (seperti tab, spasi, ruang tanpa istirahat, dll.), Dan secara samar menyebutkan bahwa "pemisah ruang" Unicode lainnya (kategori "Zs") harus diperlakukan sebagai ruang putih. Saya mungkin bukan orang terbaik untuk membahas spesifikasi dalam hal ini, tetapi bagi saya tampaknya U+200B
harus dianggap ruang kosong menurut itu, padahal kenyataannya implementasi (setidaknya Chrome dan Firefox) tampaknya memperlakukan mereka sebagai hal yang tidak terduga. token (atau bagian dari satu), menyebabkan kesalahan sintaksis.
function
kata kunci, yang tidak terlihat di Vim sampai saya menyorotnya menggunakan metode FAQ "Sorot semua yang tidak dapat dicetak". Ahh alangkah baiknya jika ada cara untuk hanya menyalin karakter di kisaran 32..127 (tapi mungkin ada aplikasi untuk itu :))
mengapa Anda mencari masalah ini ke dalam kode Anda? Bahkan, jika itu ditiru.
Jika Anda dapat melihat, apa yang sebenarnya terjadi setelah menyimpan file di folder yang disinkronkan - Anda akan melihat sesuatu seperti *****
di akhir file. Sama sekali tidak terkait dengan kode Anda.
Larutan.
Jika Anda menggunakan nginx
dalam kotak gelandangan - tambahkan ke konfigurasi server:
sendfile off;
Jika Anda menggunakan apache
dalam kotak gelandangan - tambahkan ke konfigurasi server:
EnableSendfile Off;
Sumber masalah: Bug VirtualBox
Ini juga dapat terjadi jika Anda menyalin kode dari dokumen lain (seperti PDF) ke konsol Anda dan mencoba menjalankannya.
Saya mencoba menjalankan beberapa contoh kode dari buku Javascript yang saya baca dan terkejut itu tidak berjalan di konsol.
Rupanya, menyalin dari PDF memperkenalkan beberapa karakter yang tidak terduga, ilegal, dan tidak terlihat ke dalam kode.
Saya memiliki masalah yang sama pada mac saya dan menemukan itu karena Mac mengganti tanda kutip standar dengan tanda kutip yang merupakan karakter javascript ilegal.
Untuk memperbaikinya saya harus mengubah pengaturan pada mac saya Preferensi Sistem => Keyboard => Teks (tab) hapus centang menggunakan tanda kutip cerdas dan tanda hubung (standar dicentang).
Saya mendapatkan kesalahan ini di chrome ketika saya memiliki string yang tidak tertentu setelah baris yang menunjuk kesalahan. Setelah menutup string kesalahan hilang.
Contoh 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>";
Jika Anda menjalankan gelandangan setup nginx + uwsgi maka masalah utama adalah bug kotak Virtual dengan mengirim file seperti yang disebutkan dalam beberapa jawaban. Namun untuk mengatasinya Anda harus menonaktifkan sendfile di nginx dan uwsgi.
Di nginx.conf sendfile mati
aplikasi uwsgi / config --disable-sendfile
Saat menjalankan OS X, sistem file membuat garpu tersembunyi pada dasarnya semua file Anda, jika mereka berada di hard drive yang tidak mendukung HFS +. Ini kadang-kadang (terjadi pada saya sekarang) menyebabkan mesin JavaScript Anda mencoba menjalankan fork data alih-alih kode yang Anda inginkan dijalankan. Ketika ini terjadi, Anda juga akan menerima
SyntaxError: Unexpected token ILLEGAL
karena garpu data file Anda akan berisi karakter Unicode U + 200B. Menghapus file fork data akan membuat skrip menjalankan kode Anda yang sebenarnya, bukan fork data biner dari kode Anda.
. apa pun: File-file ini dibuat pada volume yang tidak mendukung secara penuh karakteristik file HFS penuh (misalnya volume ufs, Windows fileshares, dll). Ketika file Mac disalin ke volume seperti itu, fork datanya disimpan dengan nama biasa file tersebut, dan informasi HFS tambahan (fork resource, jenis & kode pembuat, dll) disimpan dalam file kedua (dalam format AppleDouble), dengan nama yang dimulai dengan ". " (File-file ini, tentu saja, tidak terlihat sejauh menyangkut OS-X, tetapi tidak untuk OS lain; ini kadang-kadang dapat mengganggu ...)
Inilah alasan saya:
sebelum:
var path = "D:\xxx\util.s"
yang \u
merupakan pelarian, saya menemukan jawabannya dengan menggunakan JS analisis Codepen .
setelah:
var path = "D:\\xxx\\util.s"
dan kesalahan diperbaiki
Saya punya masalah yang sama dan ini terjadi karena saya menekan tombol enter ketika menambahkan kode dalam string teks.
Karena itu adalah string teks yang panjang, saya ingin melihat semuanya tanpa harus menggulir di editor teks saya, tetapi menekan enter menambahkan karakter yang tidak terlihat ke string yang ilegal. Saya menggunakan Sublime Text sebagai editor saya.
Saya akan menambahkan satu jawaban lagi ke tumpukan. Masalah ini bisa terjadi juga karena penyandian. Anda ingin pengkodean utf8 berada di sisi yang aman. Beberapa editor secara default menggunakan utf16 yang dapat menyebabkan masalah. Salah satu cara cepat untuk menguji ini, misalnya, dalam kode VS, cukup buat ulang konten yang sama tetapi gunakan editor vscode lokal untuk membuat file. Semoga ini bisa membantu.