2013-08-28 13 views
9

Her zaman strict mode kodunu korumalı (veya en azından zorla kodumu değiştirmemeyi umarak) Javascript dilindeki sorunlardan, kullanımdan kaldırılmış yöntemler veya yanlış yorumlanabilen sözdizimi kullanarak sorun.Otomatik noktalı virgül sokmayı devre dışı bırakmak veya en azından algılamak

Ancak bugün this sorununa çarptım ve tarayıcıda noktalı virgül ekleme özelliğini devre dışı bırakmanın herhangi bir yolu olup olmadığını mı merak ettim ya da başka bir deyişle, 'katı' moduna benzer 'derleme zamanı hataları var mı?

JS [H/L] int, JS yorumlayıcılarının noktalı virgül ekleyeceği yerlere ulaşabilmeleri ve bunları azaltmamızı sağlamak için onları işaretleyememektedirler.


JShint ve JSLint noktalı virgül, bir return anahtar sonra bulunursa önce yeni bir hat varsa hem hata DÜZENLEME

. Ancak, otomatik yerleştirme ile ilgili diğer uyarıları ve bunların her birinin de tespit edilip edilmediğini bilmiyorum.
İsterseniz, bir cevap 'devre dışı bırakma' bölümünü gerçekten çözerse, bu daha uygun olacaktır.

+0

İlgili, muhtemelen yinelenen: [node.js'de ASI'yi durdurma ve hata var mı?] (Http://stackoverflow.com/q/18070212/464709) –

+1

bu, düğümün yanıtlarını kısıtlamaz ve Bir kod inceleme tekniğini alternatif olarak – Hashbrown

cevap

3

return anahtar kelimesinden sonra gelen deyim ZORUNLUDUR, anahtar kelimenin olduğu satırın aynısını başlatır, bu tercümeyle ilgili değil, ECMAScript standardı tarafından tanımlanır, dilin kötü bir kısmıdır, ancak yazım kurallarına uyuyorsanız Douglas Crockford tarafından tarif edilen JS kodu, daha sonra tekrar karşılaşmayacaksınız. "JavaScript: İyi Parçaları" Kimden

Douglas Crockford tarafından (Ek A.3 Korkunç Parçalar):

JavaScript otomatik ekleme noktalı virgülle hatalı programları düzeltmeye çalışan bir mekanizmaya sahiptir. Buna güvenmeyin. Daha ciddi hataları maskeleyebilir.

Bazen hoş gelmediği yerlerde noktalı virgül ekler. Dönüş ifadesinde noktalı virgül ekleme işleminin sonuçlarını düşünün. bir dönüş ifadesi bir değer döndürürse, bu değer ifade dönüşü aynı satırda başlamalıdır:

return 
{ 
    status: true 
}; 

Bu durum üyesini içeren bir nesne döndürmesi gibi görünmektedir. Ne yazık ki, noktalı virgül ekleme, undefined döndüren bir ifadeye dönüştürür. Noktalı virgül sokmanın programın yanlış yorumlanmasına neden olduğuna dair bir uyarı yoktur.

return { 
    status: true 
}; 

Ayrıca Douglas Crockford tarafından JavaScript kodu kuralları bkz: http://javascript.crockford.com/code.html

{sonraki satırın başında bir önceki satırın sonunda yerleştirilir ve değilse sorun önlenebilir
+0

olarak sorar, bu doğru olsa da, başka uyarılar olduğunu sanmıyorum. Ne olursa olsun, en azından, JS yorumlayıcılarının kodumuza bir şeyler eklediğini görmek ilginç olabilir (eğer otomatik bir çözüm varsa, özel durumları öğrenmenin aksine) – Hashbrown

+1

@Hashbrown, lütfen benim düzenlenmiş cevabımı inceleyin , Herhangi bir otomatik çözüm hakkında bilmiyorum, ama Java gibi kod stili kullanırsanız, bu sorun çözülür. – micnic

+1

Neler olduğunu biliyorum, durdurmak istiyorum. Eklemeye 'güvenmiyorum', beni engelliyor. Ve yine, bu konuyla ilgili nokta 'geri dönüş 'meselesiyle ilgili değil, sadece dikkatimi çektiği şey, o da ekleyeceği başka şeyler de olurdu. Köklenmeyi tercih ederim – Hashbrown

0

Sadece bu soruyla karşılaşan herkese yardımcı olabileceğimi düşündüm.
Bir projenin JS'sini küçültmek için Google'ın Closure Comiler'u kullanmaya başladım ve bana birkaç kullanışlı uyarı verdi.

$> java -jar google_closure_compiler.jar --language_in=ECMASCRIPT5_STRICT --js_output_file 'min.js' 'file1.js' 'file2.js' 
    file1.js:152: WARNING - unreachable code 
       getSomething(function() { return this.doThingo(''); }); 
      ^

    file2.js:203: WARNING - Suspicious code. The result of the 'add' operator is not being used. 
       ' to ' + (typeof obj); 
      ^

    0 error(s), 2 warning(s) 

kusurlu kod blokları aşağıdaki gibi idi (yorumlar kod derleyici bana uyarılır olduğunu eksikti açıklayın):

file1.js: 150

return generateSomeObject(bunch, of, arguments) 
     //the period before the function call was missing 
     getSomething(function() { return this.doThingo(''); }); 
} 

file2.js: 201

if (someCondition) 
    //trailing plus was missing from this line 
    throw 'Could not set ' + last + ' of ' + (typeof root) 
     ' to ' + (typeof obj); 
return old; 

Ben tarayıcı yüzden muhtemelen olarak işaretlemek olmaz (tidies kadar o tüm hatalarını fark edip bilmiyorum bir cevap), ama YUI'nin kıymetinin benim için yaptıklarından çok daha fazlasını yapıyor (ki bu durumların hepsini göz ardı ediyordu).
Ayrıca, YUI ile karşılaştırıldığında, derleyici birden çok dosya girişini alabilir ve bu yüzden hatalar için dosya başına satır numaralarını verebilir ve debugger anahtar sözcüğünü yeniden/geçersiz kılma hatası vermez).
Umarım bu da size yardımcı olur.

İlgili konular