Olası Javascript hatası durumları: "Beklenen tanımlayıcı, dize veya sayı"


87

Bazı kullanıcılar sitemde ara sıra JS hataları bildiriyor. Hata mesajı "Beklenen tanımlayıcı, dize veya sayı" diyor ve satır numarası 423725915'tir, bu yalnızca rastgele bir sayıdır ve bu olduğunda her rapor için değişir. Bu çoğunlukla IE7 / Mozilla 4.0 tarayıcılarında olur.

Kodumu birkaç kez taradım ve jslint'i çalıştırdım, ancak hiçbir şey almadı - bu hata mesajına yol açan genel JS sorunları türünü bilen var mı?


Akla gelen ilk şey apaçıktır.
Anthony Forloney

Sonunda sarkan bir virgül olan bir dizi değişmez olabilir mi? (Ayrıca, "Mozilla 4.0" nedir?)
Pointy

UserAgent dizesinde Mozilla 4.0 uyumlu
psychotik

Yanıtlar:


150

Bu tür bir hatanın nedeni genellikle bir nesne veya dizi tanımındaki yanlış yerleştirilmiş virgül olabilir:

var obj = {
   id: 23,
   name: "test",  <--
}

Rastgele bir satırda görünüyorsa, dinamik olarak oluşturduğunuz bir nesne tanımının parçası olabilir.


eksikti; bir olay atamasında. Dinamik olarak oluşturulmuş nesnelere bakma ipucu bunu anlamaya yardımcı oldu. jslint bunu başlangıçta bulamadı çünkü bir html sayfasının parçası olarak satır içi js olarak üretildi. Teşekkür!
psychotik

2
Hayır olmaz. Çoğu modern tarayıcı bunu sizin için düzeltir. IE6 / 7 yapmaz. Ve IE7 öykünme modunda IE8 hata ayıklaması bunu yakalayamaz. (IE7'nin bir hata ayıklayıcısına sahip olmadığını bildiğinizi tahmin ediyorum - VS'yi IE7 ile kullanmak da bunu yakalayamaz). Deneyin ve sonra bana söyleyin;)
psychotik

1
Teşekkür ederim! Görünüşe göre bu, Chrome gibi diğer tarayıcılarda bir sorun değil.
B Seven

5
Bu tür tekrarları ", \ s *]" ve ", \ s * \}" (tırnak işaretleri olmadan) kullanarak arayabilirsiniz. Bana çok zaman kazandırdı.
Gökhan Kurt

2
Javascript için aşağıdaki gibi satır sonları içeren ,\s*?\n?\s*?],\s*?\n?\s*?\}
normal ifade

84

Kelime sınıfını bir Javascript sözlüğünde anahtar olarak kullanmak, aynı zamanda korkunç "Beklenen tanımlayıcı, dize veya sayı" hatasını da tetikleyebilir çünkü sınıf , Internet Explorer'da ayrılmış bir anahtar kelimedir.

KÖTÜ

{ class : 'overlay'} // ERROR: Expected identifier, string or number

İYİ

{'class': 'overlay'}

Ayrılmış bir anahtar kelimeyi bir Javascript sözlüğünde anahtar olarak kullanırken, anahtarı tırnak içine alın.

Umarım bu ipucu sizi hata ayıklama cehenneminden kurtarır.


Güzel olan, bu sorunla saatlerce uğraşıyorum. Şimdi çözüldü.
John Prado

Beni bu javascript kütüphanesine gereğinden fazla bakmaktan kurtardığınız için teşekkür ederim efendim.
Khepri

1
JSHint'e bir hata gönderdim, umarım gelecekte bu tür hataları tespit edebilirler: github.com/jshint/jshint/issues/1000
travis

1
@travis Aslında # 674 sonucunda buna izin verdiler :-)
cmbuckley

3
Tamamen aynı hatayı aldım, ancak "içe aktarma" özelliğinde. İşte "Ayrılmış Kelimeler" tam listesi developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Edgar Zagórski

11

Aslında yakın zamanda IE'de buna benzer bir şey aldım ve JavaScript sözdizimi "hataları" ile ilgiliydi. Alıntılarda hata diyorum çünkü her yerde iyiydi ama IE'de. Bu IE6 altındaydı. Sorun, JSON nesnesi oluşturma ve aşağıdaki gibi ekstra bir virgülle ilgiliydi:

{ one:1, two:2, three:3, }

IE6 gerçekten 3'ten sonra virgülden hoşlanmıyor. Böyle bir şey arayabilirsin, dokunaklı küçük sözdizimi formalite sorunları.

Evet, 25 satır JavaScript'imdeki multi-milyon satır numarasının da ilginç olduğunu düşündüm.

İyi şanslar.


+1 Bu bana çok yardımcı oldu. Ekstra soru işareti benim için ie8'i kırmadı, ancak ie7'yi kırdı.
Ivan Durst

9

Bu kesin bir cevapsızlıktır: Başkalarının doğru cevaplara yönelmesine yardımcı olmak için cazip ama yanlış bir cevabı ortadan kaldırmak.

Hata ayıklama sorunu vurgulayacak gibi görünebilir. Ancak, sorunun oluştuğu tek tarayıcı IE'dir ve IE'de yalnızca orijinal belgenin parçası olan kodda hata ayıklayabilirsiniz. Dinamik olarak eklenen kod için, hata ayıklayıcı yalnızca gövde öğesini geçerli talimat olarak gösterir ve IE, hatanın çok büyük bir satır numarasında gerçekleştiğini iddia eder.

İşte bu sorunu IE'de gösterecek örnek bir web sayfası:

<html>
<head>
<title>javascript debug test</title>
</head>
<body onload="attachScript();">
<script type="text/javascript">
function attachScript() {
   var s = document.createElement("script");
   s.setAttribute("type", "text/javascript");
   document.body.appendChild(s);
   s.text = "var a = document.getElementById('nonexistent'); alert(a.tagName);"
}
</script>
</body>

Bu bana şu hatayı verdi:

Line: 54654408
Error: Object required

@Protectorone Javascript'i geçici olarak belgenin kendisine bir <script>etiket aracılığıyla yerel veya yüklenmiş bir kaynak olarak yerleştirin. Hata ayıklama. Çalışma betiğinize geri dönün.
ErikE

5

Az önce uygulamalarımdan birinde hatayı gördüm, tümünü yakalamak için, anahtar kelimeyle aynı olan tüm javascript özelliklerinin adını eklemeyi unutmayın.

Bu hatayı, aşağıdaki gibi bir nesnenin bulunduğu bir hataya katıldıktan sonra buldum:

var x = { class: 'myClass', function: 'myFunction'};

hata oluşturdu (sınıf ve işlev anahtar sözcüklerdir) bu, tırnak işaretleri eklenerek düzeltildi

var x = { 'class': 'myClass', 'function': 'myFunction'};

Sana biraz zaman kazandırmayı umuyorum


Ben de aynı sorunla karşılaştım. if(_features.delete){...}Kodum, silme bir anahtar kelime olduğu için hataya neden olan gibi bir şey kullanıyordu . stackoverflow.com/questions/26255/…
Snekse


2

Daha önce belirtildiği gibi, fazladan virgül kullanmak bir hataya neden oluyordu.

Ayrıca IE 7.0'da, satırın sonunda noktalı virgül olmaması bir hataya neden oluyordu. Safari ve Chrome'da sorunsuz çalışıyor (konsolda hata olmadan).


2

IE7, özellikle Chrome gibi yeni tarayıcılardan çok daha az bağışlayıcıdır. Bu hataları bulmak için JSLint kullanmayı seviyorum . Diğer şeylerin yanı sıra, bu yanlış yerleştirilmiş virgülleri bulacaktır. Uygun olmayan beyaz boşlukları yok sayma seçeneğini etkinleştirmek isteyebilirsiniz.

Yanlış yerleştirilmiş virgüllere ek olarak, bu blogda birinin bildirdiği yorumlarda:

Yalnızca IE'de (7) yalnızca "Beklenen tanımlayıcı" yazan bir hatayı araştırıyorum. Araştırmam beni bu sayfaya yönlendirdi. Biraz hayal kırıklığından sonra, rezerve edilmiş bir sözcüğü işlev adı ("anahtar") olarak kullandığım sorun ortaya çıktı. Hata net değildi ve yanlış satır numarasını gösteriyordu.



1

Bu hata, dizinin sonuna veya işlev koduna bir virgül eklediğimizde veya yok saydığımızda ortaya çıkar. Bu tür bir hata için bir web sayfasının tüm koduna bakmak gerekir.

Bir Facebook API'sini kodlarken bunu bir Facebook uygulama kodunda buldum.

<div id='fb-root'>
    <script type='text/javascript' src='http://connect.facebook.net/en_US/all.js'</script>
    <script type='text/javascript'>
          window.fbAsyncInit = function() {
             FB.init({appId:'".$appid."', status: true, cookie: true, xfbml: true});            
             FB.Canvas.setSize({ width: 800 , height: 860 , }); 
                                                       // ^ extra comma here
          };
    </script>

0

Bu bana, src ile çekilmiş ve yarıya kadar yüklenmiş bir betik gibi geliyor, bu da bir sözdizimi hatası sinüsüne neden oluyor, kalanı yüklenmiyor.


0

IE7'de nesne dizileriyle ilgili sorunlar var

columns: [
{
  field: "id",
  header: "ID"
},
{
  field: "name",
  header: "Name" , /* this comma was the problem*/ 
},
...

0

Bu hatanın başka bir çeşidi: 'Devam' adında bir işleve sahiptim ve ayrılmış bir kelime olduğu için bu hatayı attı. İşlevimi 'ContinueClick' olarak yeniden adlandırmak zorunda kaldım


0

Belki 'yapıcı' yöntemine sahip bir nesneniz vardır ve onu çağırmaya çalışın.


0

Knockout JS kullanırken bu sorunu çözebilirsiniz. Aşağıdaki örnekte olduğu gibi sınıf özniteliğini ayarlamaya çalışırsanız başarısız olur:

<span data-bind="attr: { class: something() }"></span>

Sınıf dizesinden şu şekilde çıkın:

<span data-bind="attr: { 'class': something() }"></span>

2 sentim.


0

Ben de bu konuyla karşılaşmıştım. Aşağıda iki çözüm buldum. 1). Yukarıda başkaları tarafından belirtildiği gibi, JSON nesnesinden fazladan virgül kaldırın. 2). Ayrıca, JSP / HTML’im de vardı. Bu nedenle, tarayıcının ekstra virgül için JS hatası veren eski modunu tetikliyordu. Kullanıldığında tarayıcının HTML5 modunu tetikler (destekleniyorsa) ve tıpkı diğer tarayıcılar FF, Chrome vb. Gibi Ekstra Virgülle bile iyi çalışır.


1
Stack Overflow'a hoş geldiniz! Bunun ne anlama geldiğine dair bir örnek verebilir misiniz: "Benim JSP / HTML'm vardı."
billrichards

0

İşte problemde hata ayıklamak için kolay bir teknik: betiği / kodu konsola yansıtın. Kodu konsoldan IDE'nize kopyalayın. Çoğu IDE, kod üzerinde hata kontrolü yapar ve hataları vurgular. Hatayı JavaScript / HTML düzenleyicinizde neredeyse anında görebilmeniz gerekir.


0

Farklı bir konfigürasyonla aynı sorunu yaşadım. Bu, açısal bir fabrika tanımındaydı, ancak bunun başka yerlerde de olabileceğini varsayıyorum:

angular.module("myModule").factory("myFactory", function(){
    return
    {
        myMethod : function() // <--- error showing up here
        {
            // method definition
        } 
    }
});

Düzeltme çok egzotik:

angular.module("myModule").factory("myFactory", function(){
    return { // <--- notice the absence of the return line
        myMethod : function()
        {
            // method definition
        } 
    }
});

0

Bu, bir sınıf içinde hiçliğin ortasında bir işlevi çağırırsanız, Typescript'te de olabilir. Örneğin

class Dojo implements Sensei {
     console.log('Hi'); // ERROR Identifier expected.
     constructor(){}
}

İşlev çağrıları, gibi console.log()işlevlerin içinde olmalıdır. Sınıf alanlarını bildirmeniz gereken alanda değil.


0

Windows sorunu için Typescript

Bu, IE, chrome, FF'de çalışır

export const OTP_CLOSE = { 'outcomeCode': 'OTP_CLOSE' };

Bu chrome, FF'de çalışır, IE 11'de çalışmaz

export const OTP_CLOSE = { outcomeCode: 'OTP_CLOSE' };

Sanırım bir şekilde Windows ayrılmış sözcükleriyle alakalıgörüntü açıklamasını buraya girin


0

Bu hatayla karşılaştım, sondaki virgül veya bunun gibi bir şey yerine, bu sözdizimi bir constants.js'de kullanıldı

    var titles = {
      [title.X]: 'X title',
      [title.Y]: 'Y title'
    }

IE 11 bundan hiç hoşlanmadı.

Daha önce belirtildiği gibi, bu, kullanılarak kolayca düzeltildi.

   var titles = {
     'title.X': 'X title',
     'title.Y': 'Y title'   
   }

2
Bunlar eşdeğer ifadeler değildir. Birincisi, başlık nesnesinde anahtarlar olarak title.X ve title.Y özelliklerinin değerlerini kullanır, ikincisi ise anahtar olarak "title.X" ve "title.Y" dizelerini kullanır.
nabrown
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.