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?
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?
Yanıtlar:
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.
Noktalı virgülden hemen sonra kodda görünmez bir karakter var. Bu var Unicode U+200B
Sıfır genişlikli boşluk karakteri (aka ZWSP
, HTML varlık ​
). Bu karakterin Unexpected token ILLEGAL
JavaScript sözdizimi hatasına neden olduğu bilinmektedir .
Kesin olarak söyleyemem ama bahsim jsfiddle'da . Kodu oradan yapıştırırsanız, bir veya daha fazla U+200B
karakter 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+200B
artı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 veyaEnableSendfile Off
Apache 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.
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.
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, nodeValue
gö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 .
ZWSP
HTML 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 ZWSP
CSS 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 Spesifikasyonu'nda (sürüm 3 ve 5.1 ) bu özel karakterden bahsetmedim . Mevcut sürüm benzer karakterler bahseder ( U+200C
ve U+200D
üzerine) Bölüm 7.1 de olarak ele alınmalıdır diyor ki, IdentifierPart
ne 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+200B
gö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.
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 :))
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.
nginx
Vagrant kutusunda kullanıyorsanız - sunucu yapılandırmasına ekleyin:
sendfile off;
apache
Vagrant kutusunda kullanıyorsanız - sunucu yapılandırmasına ekleyin:
EnableSendfile Off;
Sorunun kaynağı: VirtualBox Hatası
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.
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).
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>";
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.
Nginx.conf sendfile dosyasında
uwsgi application / config --disable-sendfile
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 ...)
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.
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.