JavaScript kitaplıklarındaki önde gelen noktalı virgül ne işe yarar?


156

Birkaç JavaScript kütüphanesinde bu gösterimi en başında gördüm:

/**
 * Library XYZ
 */
;(function () {
  // ... and so on

"Hemen yürütülen işlev" sözdiziminde son derece rahatım

(function(){...})()

Baştaki noktalı virgülün ne için olduğunu merak ediyordum. Gelebileceğim tek şey bunun bir sigorta olması. Yani, kütüphane başka bir buggy koduna gömülmüşse, "son ifade burada en sonda biter" türünde bir hız tümseği işlevi görür.

Başka bir işlevi var mı?


Yanıtlar:


140

Tek bir HTTP isteği olarak daha hızlı hizmet vermek için birkaç JavaScript dosyasını güvenli bir şekilde bir araya getirmenize izin verir.


16
Ancak, tüm dosyalar doğru şekilde kodlanırsa gerekli olmaz mı?
Boldewyn

8
Hayır: Örneğin, alırsınız (function(){...})()(function(){...})().
Aaron Digulla

8
'Doğru şekilde kodlanmış' demek istediğim, her kütüphane doğru miktarda noktalı virgülle bitiyor ...
Boldewyn

6
Evet Boldewyn, ama durum böyle değil.
Mathias Bynens

13
İki kötü kodlanmış dosya, yalnızca üçüncü bir dosyanın bu kirli düzeltmeyi içermesi gerçeğine uymayacaktır. Birleştirici neden sonuçtaki dosyalar arasına fazladan noktalı virgül ekleyemiyor?
Dávid Horváth

30

En iyi cevap aslında soruda verildi, bu yüzden bunu netlik için buraya yazacağım:

Önde gelen ;düzgün ile sonlandırıldı bir ifade ihtiva eden bir dosyaya birleştirme sırasında dosyayı eklerken hataları önlemek için hemen-çağrılan işlev ifadeleri önünde bulunmaktadır edilir ;.

En iyi uygulama, ifadelerinizi noktalı virgülle sonlandırmak, ancak önde gelen noktalı virgülü bir koruma olarak kullanmaktır.


Defansif noktalı virgül kullanıyorsanız neden ifadelerinizi noktalı virgülle sonlandırmalısınız? Ya her satırın sonunda orada bulunan noktalı virgüllere güvenme şansına sahip olursunuz ya da savunma noktalı virgül kullanırsınız. Her ikisini de yapmak insanları yanlış bir şekilde her ikisini de yapmanın bir nedeni olduğu sonucuna varır. Savunma noktalı virgül kullanma önerisi iyidir; danışma ayrıca her geçtiği yerde değiştirmek için "\n"birlikte ";\n"hiçbir mantıklı.
Vladimir Kornea

4
@VladimirKornea: Çünkü her zaman sadece kendi kütüphanelerini
kullanmıyorsun

@jvenema Bunun neden bir fark yarattığını düşündüğünüzü bilmiyorum.
Vladimir Kornea

6
Çünkü sözleşmelerinizi izleyen başka birinin koduna güvenemezsiniz. Defansif olarak kodlayın ve sonra zorunda değilsiniz.
jvenema

1
@VladimirKornea İsterseniz bunu savunmacı olarak da düşünebilirsiniz - her zaman savunma noktalı virgülleriyle başlamayan bir başkasının koduna karşı savunur.
Nathan Hinchey

26

Genel olarak, bir ifade (, [, /, + veya - ile başlıyorsa, ifadenin daha önce ifadenin devamı olarak yorumlanması ihtimali vardır. /, + Ve - ile başlayan ifadeler uygulamada oldukça nadirdir , ancak en azından bazı JavaScript programlama stillerinde başlayan (ve hiç de nadir değildir) Bazı programcılar, herhangi bir ifadenin başına bir savunma noktalı virgül koymayı sever, böylece ifade doğru olsa bile düzgün çalışmaya devam eder değiştirilmeden ve önceden sonlandırılmış bir noktalı virgül kaldırılmadan önce:

var x = 0 // Semicolon omitted here
;[x,x+1,x+2].forEach(console.log) // Defensive ; keeps this statement separate

Kaynak:

JavaScript: Kesin Kılavuz, 6. baskı


9

Buna önde gelen noktalı virgül denir.

Ana amacı, yanlış kapatılmış ve sorunlara neden olabilecek önceki kodlardan korunmaktır. Noktalı virgül bunun olmasını engelleyecektir. Önceki kod yanlış kapatılmışsa noktalı virgül bunu düzeltir. Düzgün kapatıldıysa noktalı virgülümüz zararsız olacak ve yan etkisi olmayacaktır.


7

Tek satırlık bir cevap, birden fazla JavaScript dosyasını güvenli bir şekilde birleştirmektir. Noktalı virgül kullanmak sorun yaratmaz.

Birden fazla fonksiyonunuz olduğunu varsayalım:

IIFE 1

(function(){
  // The rest of the code
})(); // Note it is an IIFE

IIFE 2

(function(){
   // The rest of the code
})(); // Note it is also an IIFE

Birleştirmede şöyle görünebilir:

(function(){})()(function(){})()

Ancak işlevden önce noktalı virgül eklerseniz şu şekilde görünür:

;(function(){})();(function(){})()

Dolayısıyla a ekleyerek ;herhangi bir ifadenin düzgün bir şekilde sonlandırılmamasına dikkat eder.

ÖRNEK 2

Değişkenli bir JavaScript dosyanız olduğunu varsayın:

var someVar = "myVar"

Bazı işlevleri olan başka bir JavaScript dosyası:

(function(){})()

Şimdi birleştirme sırasında şöyle görünecek

var someVar = "myVar"(function(){})() // It may give rise to an error

Noktalı virgülle şöyle görünecektir:

var someVar = "myVar";(function(){})()

4

JavaScript kodunu küçültmeniz iyi olur. Beklenmeyen sözdizimi hatalarını önler.


Ne gibi? Noktalı virgül aşağıdaki kod için herhangi bir öneme sahip mi yoksa sadece gerçek kütüphanenin önünde birleştirilmiş varsayımsal hata kodu için mi?
Boldewyn

Bu kodlar tek başına, özel bir anlamı yoktur, ancak bu kod diğer kodların ortasındaysa ve tek bir satıra küçültüldüğünüzde, (1) önceki satırlarda noktalı virgül eksik, (1) gibi beklenmedik hatalar olabilir. ) Bir öncekinin de işlevleri olduğu için () () () () olacaktır, hata aldığında, hata ayıklamak zor, biz buggy diyemeyiz, çünkü önce iyi çalışıyor minimize.
SİZ

1
Ancak bunu doğru bir şekilde ele almak kesinlikle madencinin sorumluluğundadır. Adamcağız minimizerler bugünlerde norm mu?
Vladimir Kornea
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.