“Beklenmeyen simge ILLEGAL” için görünür bir neden yok


270

Konsolumda şu JavaScript hatasını alıyorum:

Yakalanmayan Sözdizimi Hatası: Beklenmeyen simge ILLEGAL

Bu benim kodum:

var foo = 'bar';​

Gördüğünüz gibi çok basit. Nasıl bir sözdizimi hatasına neden olabilir?


9
Gelecekteki okuyucular için: Vagrant kullanırken bu hatayla karşılaşırsanız - bu cevap da yardımcı olabilir: stackoverflow.com/questions/9479117/…
OZ_

Bunu WordPress'te yaşıyorsanız, komut dosyalarını function.php dosyasından sıkın. Doğrudan şablondan JS için aradığım belirli bir şablon vardı. Wp_head veya wp_footer içinde koşullu bir sıralamaya geçmek bunu çözdü.
Alpesh Shah

7
Moderatörün Notu: Burada soruyu gerçekten cevaplamayan bir grup cevabı sildim. Bu, tekrarlamıyorum , JavaScript'te bu hatayla sonuçlanabilecek her şeyi listelemek için bir yer değil . Soru bu senaryoların herhangi içermeyen çok özel bir durum vardır ve tüm bu örnekler sadece yok soruya cevap.
animuson

3
Vay be, SO polisi bu soruyla bir tarla günü geçirdi. Neyse ki, silinen cevaplarda ilgili bilgilerin bir kısmı hala görülebilir.
cdonner

Yanıtlar:


493

Hata

Kod JavaScript yorumlayıcısı tarafından ayrıştırıldığında, "jetonlar" adı verilen parçalara ayrılır. Bir belirteç dört temel belirteç türünden birine sınıflandırılamadığında , çoğu uygulamada "ILLEGAL" olarak etiketlenir ve bu hata atılır.

Örneğin, haydut bir @karakter, yanlış yerleştirilmiş bir küme ayracı, köşeli ayraç, "akıllı tırnaklar", düzgün tırnaklar içine alınmayan tek tırnaklar (ör. this.run('dev1)) Vb . İle bir js dosyası çalıştırmayı denerseniz aynı hata ortaya çıkar .

Birçok farklı durum bu hataya neden olabilir. Ancak belirgin bir sözdizimi hatası veya yasadışı karakteriniz yoksa, görünmez bir yasadışı karakterden kaynaklanabilir. Bu cevabın konusu bu.

Ama yasadışı bir şey göremiyorum!

Noktalı virgülden hemen sonra kodda görünmez bir karakter var. Bu var Unicode U+200BSıfır genişlikli boşluk karakteri (aka ZWSP, HTML varlık ​). Bu karakterin Unexpected token ILLEGALJavaScript sözdizimi hatasına neden olduğu bilinmektedir .

Ve nereden geldi?

Kesin olarak söyleyemem ama bahsim jsfiddle'da . Kodu oradan yapıştırırsanız, bir veya daha fazla U+200Bkarakter içermesi muhtemeldir . Araç, bu karakteri uzun dizelerde sözcük kaydırmayı kontrol etmek için kullanıyor gibi görünüyor.

GÜNCELLEME 2013-01-07

Son sonra jsfiddle güncelleme , kırmızı bir nokta olarak şimdi karakterini gösteriyor codepen sevmez. Görünüşe göre , U+200Bartık kendi başına karakter eklemiyor, bu nedenle bu sorun bundan sonra daha az sıklıkta olmalı.

GÜNCELLEME 2015-03-17

Vagrant , bazen VirtualBox'daki bir hata nedeniyle bu soruna da neden oluyor gibi görünüyor . Gereğince çözüm, bu blog post kümesine olan sendfile off;sizin nginx config veya EnableSendfile OffApache kullanırsanız.

Aynı zamanda oldu bildirilen Chrome geliştirici araçlarından yapıştırılan kod bu karakteri içerebileceğini ama güncel sürümü (OSX'te 22.0.1229.79) ile bu çoğaltmak edemedi.

Nasıl tespit edebilirim?

Karakter görünmez, orada olduğunu nasıl bilebiliriz? Editörünüzden görünmez karakterler göstermesini isteyebilirsiniz. Çoğu metin editöründe bu özellik vardır. Örneğin Vim, bunları varsayılan olarak ve ZWSPşovları olarak görüntüler <u200b>. Çevrimiçi olarak hata ayıklayabilirsiniz: jsbin karakteri kod bölmelerinde kırmızı bir nokta olarak görüntüler (ancak sayfayı kaydettikten ve yeniden yükledikten sonra kaldırmış gibi görünüyor). CodePen.io ayrıca bir nokta olarak görüntüler ve kaydettikten sonra bile tutar.

İlgili sorunlar

Bu karakter kötü bir şey değil, aslında oldukça yararlı olabilir. Wikipedia'daki bu örnek, uzun bir dizenin sonraki satıra nereye sarılması gerektiğini kontrol etmek için nasıl kullanılabileceğini gösterir. Ancak, karakterin işaretlemenizdeki varlığından haberdar değilseniz, bu bir sorun haline gelebilir. Bir dizenin (örneğin, nodeValuegörünür içeriği olmayan bir DOM öğesinin) içinde varsa, gerçekte olmadığında (uyguladıktan sonra bile String.trim) bu dizenin boş olmasını bekleyebilirsiniz .

ZWSPHTML sayfasında, örneğin iki <div>öğe arasında bulunduğunda ( bu soruda görüldüğü gibi ) ekstra boşluk görüntülenmesine neden olabilir . Bu durum jsfiddle'da bile tekrarlanamaz, çünkü karakter orada göz ardı edilir.

Başka bir olası sorun: web sayfasının kodlaması UTF-8 olarak tanınmazsa, karakter gerçekte görüntülenebilir ( ​örneğin latin1'de olduğu gibi).

Eğer ZWSPCSS kodu (satır içi kodu veya harici bir stil) üzerinde mevcut olan bazı stilleri uygulanan alamadım bu yüzden (görüldüğü gibi, stiller de düzgün ayrıştırılamaz bu soruya ).

ECMAScript Şartnamesi

ECMAScript Spesifikasyonu'nda (sürüm 3 ve 5.1 ) bu özel karakterden bahsetmedim . Mevcut sürüm benzer karakterler bahseder ( U+200Cve U+200Düzerine) Bölüm 7.1 de olarak ele alınmalıdır diyor ki, IdentifierPartne zaman "Yorum, dize hazır ve düzenli ifade değişmezleri dışında" s. Bu karakterler, örneğin, değişken adın bir parçası olabilir (ve var x\u200c;gerçekten de işe yarar).

Bölüm 7.2 , geçerli Beyaz boşluk karakterlerini (sekme, boşluk, aralıksız boşluk vb.) Listeler ve diğer Unicode “boşluk ayırıcılarının” (“Zs” kategorisi) beyaz boşluk olarak ele alınması gerektiğini açıkça belirtir. Muhtemelen bu konuda özellikleri tartışmak için en iyi kişi değilim, ama bana U+200Bgöre, aslında uygulamalar (en azından Chrome ve Firefox) beklenmedik gibi göründüğünde buna göre beyaz alan olarak düşünülmelidir. belirteç (veya birinin bir parçası) sözdizimi hatasına neden olur.


codepen.io da bu karakteri gösteriyor gibi görünüyor. VIM ve VI, ayrıca notepad ++ görüntüler.
rlemon

Teşekkürler @rlemon, cevaba bir CodePen örneği ekledi. Güzel site, bunu bilmiyordum.
bfavaretto

Chromium kullanarak bu SO sorusundan testTwo sınıfı için kod kopyalama / yapıştırma yaparken bu sorunla karşılaştı . Görünüşe göre, ayrıştırıcı function, "Yazdırılabilir olmayan tüm karakterleri vurgula" SSS yöntemini vurgulayana kadar Vim'de görünmeyen anahtar kelimenin sözdizimi vurgulamasını boğdu . Ahh sadece 32..127 aralığında karakterleri kopyalamanın bir yolu olsaydı çok güzel olurdu (ama muhtemelen bunun için bir uygulama var :))
ack

1
@bfavaretto, yalnızca düzenleme modunda kod snippet'inde. Sorunun bedeninde değil, bundan bahsetmeliydim. (Chrome 43.0.2357.124 m'de test edilmiştir)
Fernando Leal

1
Birçok metin düzenleyici, bir dosyanın karakter kodlamasını değiştirmeye izin verir. Bu gibi rahatsız edici karakterler bulmak için çok faydalıdır. Benim çözümüm geçici olarak UTF-8'den bir ANSI kodlamasına geçmek, geçersiz karakterleri kaldırmak ve sonra geri dönmekti. Windows'ta ücretsiz Notepad ++ kullandım. EDIT: "Tüm karakterleri görüntülemek" için Notepad ++ seçeneğini kaçırdım çıkıyor. Aynı sonuç, daha az güçlük: D
mbargiel

64

neden kodunuzu bu sorunu arıyorsunuz? Kopyalanmış olsa bile.

Gördüyseniz, dosyayı senkronize klasöre kaydettikten sonra tam olarak ne olduğunu - *****dosyanın sonunda gibi bir şey göreceksiniz . Kodunuzla hiç ilgili değil.

Çözüm.

nginxVagrant kutusunda kullanıyorsanız - sunucu yapılandırmasına ekleyin:

sendfile off;

apacheVagrant kutusunda kullanıyorsanız - sunucu yapılandırmasına ekleyin:

EnableSendfile Off;

Sorunun kaynağı: VirtualBox Hatası


6
Gerçekten benim günümü kurtardın. Bütün bir akşam Nginx + Vagrant ile mücadele ettim ve bu çözüldü.
fradeve

2
Did DEĞİL bu kadar çok, ama öyleydi (benim için) teşekkür doğru cevap olmasını bekliyoruz.
Charlotte

2
Aslında çalışmayı bıraktı. Sonra tekrar burada oyun oynarken birden fazla symlinking katmanları var, bu yüzden ne yapabileceğime karar verdim.
Charlotte

Teşekkürler - Ben nginx ile vagrant bir kutu vardı. Bu sorunu benzer Apache kurulumlarında da gördüm.
Cameron

apache için: EnableSendfile Off
jamlee 21:16

7

Bu, başka bir belgeden (PDF gibi) kodu konsolunuza kopyalayıp çalıştırmaya çalışıyorsanız da olabilir.

Okuduğum bir Javascript kitabından bazı örnek kod çalıştırmaya çalışıyordum ve konsolda çalışmadığı için şaşırdım.

Görünüşe göre, PDF'den kopyalamak koda beklenmedik, yasadışı ve görünmez karakterler ekliyor.


5

Mac'imde de aynı sorunu yaşadım ve Mac'in standart tırnakları yasadışı javascript karakterleri olan kıvırcık tırnaklarla değiştirdiği için buldum.

Bunu düzeltmek için mac sistemimdeki ayarları değiştirmek zorunda kaldım Sistem Tercihleri ​​=> Klavye => Metin (sekme) akıllı tırnak işaretleri ve tireler kullan seçeneğinin işaretini kaldırın (varsayılan işaretli).


5

Hatanın işaret ettiği satırdan sonra sonlandırılmamış bir dize olduğunda bu hatayı kromda aldım. Dizeyi kapattıktan sonra hata ortadan kalktı.

Hatalı örnek:

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>";

Hatasız örnek:

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
Farkı anlamak için iki örneğinize bir fark göstermek zorunda kaldım ve bir kez yaptım hemen kendi sorunumu çözdüm.
Ben Harold

3

Eğer bir nginx + uwsgi kurulum vagrant çalıştırıyorsanız o zaman ana sorun bazı cevaplarda belirtildiği gibi gönderme dosyası ile Sanal kutu hata. Ancak bunu çözmek için nginx ve uwsgi dosyalarında sendfile işlevini devre dışı bırakmanız gerekir.

  1. Nginx.conf sendfile dosyasında

  2. uwsgi application / config --disable-sendfile


2

OS X çalıştırılırken, dosya sistemi, HFS + 'yı desteklemeyen bir sabit sürücüdeyse, temelde tüm dosyalarınızın gizli çatallarını oluşturur. Bu bazen (şimdi bana oldu) JavaScript motorunuzun çalıştırmayı planladığınız kod yerine data-fork'u çalıştırmaya çalışmasına neden olabilir. Bu olduğunda, ayrıca

SyntaxError: Unexpected token ILLEGAL

çünkü dosyanızın veri çatalı Unicode U + 200B karakterini içerecektir. Veri çatalı dosyasının kaldırılması, komut dosyanızın kodunuzun ikili veri çatalı yerine gerçek, istenen kodunuzu çalıştırmasını sağlar.

.her neyse: Bu dosyalar yerel olarak tam HFS dosya özelliklerini desteklemeyen birimlerde oluşturulur (örn. ufs birimleri, Windows dosya paylaşımları, vb.). Bir Mac dosyası böyle bir birime kopyalandığında, veri çatalı dosyanın normal adı altında depolanır ve ek HFS bilgileri (kaynak çatalı, tür ve yaratıcı kodları vb.) İkinci bir dosyada (AppleDouble formatında) depolanır, ile başlayan bir adla . (Bu dosyalar elbette OS-X söz konusu olduğunda görünmezdir, ancak diğer işletim sistemlerine göre görünmez; bu bazen sinir bozucu olabilir ...)


1

İşte nedenim:

önce:

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

Bu \ubir kaçış, ben Codepen kullanarak anladım 'ın analiz JS .

sonra:

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

ve hata düzeltildi


0

Aynı sorunu vardı ve bir metin dizesine kod eklerken enter tuşuna basmıştı çünkü oluştu.

Uzun bir metin dizesi olduğu için, metin düzenleyicimde kaydırmak zorunda kalmadan hepsini görmek istedim, ancak enter'a basmak, dizeye yasadışı olan görünmez bir karakter ekledi. Editörüm olarak Sublime Text kullanıyordum.


0

Tüm uzay alanlarını & nbsp olarak değiştirdim, aynen böyle ve sorunsuz çalıştı.

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

Umarım birine yardımcı olur.


0

Yığına bir cevap daha ekleyeceğim. Bu sorun kodlama nedeniyle de olabilir. Utf8 kodlamasının güvenli tarafta olmasını istiyorsunuz. Bazı editörler varsayılan olarak soruna neden olabilecek utf16 kullanır. Bunu test etmenin hızlı bir yolu, örneğin VS kodunda aynı içeriği yeniden oluşturmaktır, ancak dosyayı oluşturmak için yerel vscode düzenleyicisini kullanmaktır. Umarım bu biraz yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.