Tidak ada penyebab yang terlihat untuk “Token tak terduga ILLEGAL”

270

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?

bfavaretto
sumber
9
Untuk pembaca yang akan datang: jika Anda menemukan kesalahan ini ketika menggunakan Vagrant - jawaban ini juga dapat membantu: stackoverflow.com/questions/9479117/…
OZ_
Jika Anda mengalami hal ini di WordPress, enqueue skrip dari functions.php. Saya memiliki templat khusus tempat saya memanggil JS langsung dari templat. Beralih ke enqueue bersyarat di wp_head atau wp_footer telah mengatasi ini.
Alpesh Shah
7
Catatan Moderator: Saya menghapus banyak jawaban di sini yang sebenarnya tidak menjawab pertanyaan. Ini bukan, saya ulangi bukan , tempat untuk mendaftar setiap hal yang mungkin dapat Anda lakukan dalam JavaScript yang akan menghasilkan kesalahan ini. Pertanyaannya memiliki keadaan yang sangat spesifik yang tidak melibatkan skenario mana pun, dan semua contoh itu tidak menjawab pertanyaan itu.
animuson
3
Wow, polisi SO mengalami hari lapangan dengan pertanyaan ini. Untungnya, beberapa informasi yang relevan masih terlihat dalam jawaban yang dihapus.
cdonner

Jawaban:

493

Kesalahannya

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.

Tetapi saya tidak dapat melihat sesuatu yang ilegal!

Ada karakter yang tidak terlihat dalam kode, tepat setelah titik koma. Ini adalah karakter Unicode U+200BZero-width space (alias ZWSP, entitas HTML ​). Karakter itu diketahui menyebabkan Unexpected token ILLEGALkesalahan sintaksis JavaScript.

Dan dari mana asalnya?

Saya tidak tahu pasti, tapi taruhan saya ada di jsfiddle . Jika Anda menempelkan kode dari sana, sangat mungkin untuk memasukkan satu atau lebih U+200Bkarakter. 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+200Bkarakter 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, atau EnableSendfile Offjika 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).

Bagaimana saya bisa menemukannya?

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

Masalah terkait

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, nodeValueelemen DOM yang tidak memiliki konten yang terlihat), Anda mungkin mengharapkan string tersebut menjadi kosong, padahal sebenarnya tidak (bahkan setelah menerapkan String.trim).

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

Spesifikasi Naskah ECMAS

Saya tidak dapat menemukan penyebutan karakter tertentu pada Spesifikasi Naskah ECMAS (versi 3 dan 5.1 ). Versi saat ini menyebutkan karakter yang sama ( U+200Cdan 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+200Bharus 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.

bfavaretto
sumber
codepen.io juga muncul untuk menampilkan karakter ini. VIM dan VI, juga notepad ++ menampilkannya.
rlemon
Terima kasih @rlemon, tambahkan contoh CodePen ke jawabannya. Situs yang bagus, saya tidak tahu tentang itu.
bfavaretto
Mengalami masalah ini saat menyalin / menempelkan kode untuk kelas testTwo dari pertanyaan SO ini menggunakan Chromium. Rupanya, parser tersedak oleh penyorotan sintaks dari functionkata 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 :))
ack
1
@ bfavaretto, hanya dalam cuplikan kode dalam mode edit. Tidak di tubuh pertanyaan, seharusnya menyebutkan ini. (Diuji pada Chrome 43.0.2357.124 m)
Fernando Leal
1
Banyak editor teks memungkinkan pengalihan pengkodean karakter file. Ini sangat berguna untuk menemukan karakter yang menyinggung seperti ini. Solusi saya adalah untuk sementara beralih dari UTF-8 ke pengkodean ANSI, menghapus karakter yang tidak valid, lalu beralih kembali. Saya menggunakan Notepad ++ freeware di Windows. EDIT: Ternyata saya ketinggalan opsi Notepad ++ untuk "Menampilkan Semua Karakter". Hasil yang sama, lebih mudah: D
mbargiel
64

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 nginxdalam kotak gelandangan - tambahkan ke konfigurasi server:

sendfile off;

Jika Anda menggunakan apachedalam kotak gelandangan - tambahkan ke konfigurasi server:

EnableSendfile Off;

Sumber masalah: Bug VirtualBox

Nikolay Fominyh
sumber
6
Anda benar-benar menyelamatkan hari saya. Saya telah berjuang dengan Nginx + Vagrant sepanjang malam, dan ini menyelesaikannya.
fradeve
2
Apakah tidak berharap ini menjadi jawaban yang tepat (untuk saya) tapi itu, terima kasih banyak.
Charlotte
2
Sebenarnya, itu berhenti bekerja. Kemudian lagi ada beberapa lapisan symlinking yang dimainkan di sini jadi saya hanya membuka kancing apa yang saya bisa.
Charlotte
Terima kasih - Saya berada di kotak gelandangan dengan nginx. Saya juga melihat masalah ini pada pengaturan Apache yang serupa.
Cameron
untuk apache: EnableSendfile Off
jamlee
7

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.

Kyle Pennell
sumber
5

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

pengguna3360944
sumber
5

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>";
Ozzy
sumber
2
Saya harus menjalankan perbedaan pada dua contoh Anda untuk mengetahui perbedaannya, dan begitu saya melakukannya, saya segera menemukan masalah saya sendiri.
Ben Harold
3

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.

  1. Di nginx.conf sendfile mati

  2. aplikasi uwsgi / config --disable-sendfile

msrivas
sumber
2

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

Spcaeyob
sumber
1

Inilah alasan saya:

sebelum:

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

yang \umerupakan pelarian, saya menemukan jawabannya dengan menggunakan JS analisis Codepen .

setelah:

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

dan kesalahan diperbaiki

Miao1007
sumber
0

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.

Jordan Davis
sumber
0

Saya mengubah semua area ruang menjadi & nbsp, begitu saja dan itu bekerja tanpa masalah.

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

Saya harap ini membantu seseorang.

Erdogan
sumber
0

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.

Rezeli
sumber