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?
javascript
syntax-error
illegal-characters
bfavaretto
sumber
sumber
Jawaban:
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 (misalnyathis.run('dev1)
) dan sebagainya.Tetapi saya tidak dapat melihat sesuatu yang ilegal!
Ada karakter yang tidak terlihat dalam kode, tepat setelah titik koma. Ini adalah karakter Unicode
U+200B
Zero-width space (aliasZWSP
, entitas HTML​
). Karakter itu diketahui menyebabkanUnexpected token ILLEGAL
kesalahan 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+200B
karakter. Tampaknya alat menggunakan karakter itu untuk mengontrol pembungkus kata pada string panjang.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
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.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,
nodeValue
elemen DOM yang tidak memiliki konten yang terlihat), Anda mungkin mengharapkan string tersebut menjadi kosong, padahal sebenarnya tidak (bahkan setelah menerapkanString.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 ).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+200C
danU+200D
) pada Bagian 7.1 , yang mengatakan mereka harus diperlakukan sebagaiIdentifierPart
"ketika di luar komentar, string literal, dan literal ekspresi reguler". Karakter-karakter tersebut dapat, misalnya, menjadi bagian dari nama variabel (danvar 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.sumber
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:Jika Anda menggunakan
apache
dalam kotak gelandangan - tambahkan ke konfigurasi server:Sumber masalah: Bug VirtualBox
sumber
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.
sumber
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).
sumber
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:
Contoh tanpa kesalahan:
sumber
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
sumber
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
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.
sumber
Inilah alasan saya:
sebelum:
yang
\u
merupakan pelarian, saya menemukan jawabannya dengan menggunakan JS analisis Codepen .setelah:
dan kesalahan diperbaiki
sumber
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.
sumber
Saya mengubah semua area ruang menjadi & nbsp, begitu saja dan itu bekerja tanpa masalah.
Saya harap ini membantu seseorang.
sumber
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.
sumber