Javascript'teki her işlevden sonra neden noktalı virgül kullanmalıyım?


282

Farklı geliştiriciler javascript fonksiyonları sonra noktalı virgül içerir gördüm ve bazı değil. Hangisi en iyi uygulama?

function weLikeSemiColons(arg) {
   // bunch of code
};

veya

function unnecessary(arg) {
  // bunch of code
}

Yanıtlar:


424

Sonra noktalı virgül işlev bildirimleri vardır gerekli değildir .

A'nın dilbilgisi spesifikasyondaFunctionDeclaration şu şekilde tarif edilir:

function Identifier ( FormalParameterListopt ) { FunctionBody }

Gramer olarak noktalı virgül gerekmez, ama nedenini merak edebilir misiniz?

Noktalı virgül ayırmak için hizmet ifadeleri birbirinden ve FunctionDeclarationbir değil beyanı .

FunctionDeclarationsdeğerlendirilir önce kod çalıştırma girer, kaldırma a, ortak kelime bu davranış açıklamak için kullanılır.

"İşlev bildirimi" ve "işlev deyimi" terimleri genellikle birbirinin yerine kullanılır, çünkü ECMAScript Spesifikasyonu'nda tarif edilen bir işlev deyimi yoktur, ancak gramerlerine, özellikle de Mozilla'ya bir işlev deyimi içeren bazı uygulamalar vardır. standart değildir.

Bununla birlikte FunctionExpressions, kullandığınız yerlerde her zaman noktalı virgüller önerilir , örneğin:

var myFn = function () {
  //...
};

(function () {
  //...
})();

Yukarıdaki örnekte ilk işlevden sonra noktalı virgül kullanmazsanız, tamamen istenmeyen sonuçlar elde edersiniz:

var myFn = function () {
  alert("Surprise!");
} // <-- No semicolon!

(function () {
  //...
})();

İlk işlev hemen yürütülür, çünkü ikincisini çevreleyen parantezler Argumentsbir işlev çağrısı olarak yorumlanır .

Önerilen dersler:


2
Açıklamak için düzenlenmiş olan bu makale işlev ifadelerinden
CMS

1
ECMA'ya tamamen aşina değilim, ama aynı zamanda kullandığım standart da bu. İyi yazı. Online gördüğüm tuts çoğu ve kod örnekleri ben DL bu standardı kullanın, bu yüzden sadece adapte ettik.
regex

1
Buradaki karışıklıklardan bazıları, "göz ardı edileceğinden izin verildiği" için iyi bir İngilizce kelime eksikliğinden etkilenebilir. "İsteğe bağlı" demeye geri dönüyoruz, ancak bir yanılgıdan sonra noktalı virgül eklenmemesinin, ifadeden sonra noktalı virgül içermemesi ile aynı kategoriye düştüğünü gösterdiği için yanıltıcıdır. İkincisi tamamen farklı bir anlamda isteğe bağlıdır: ayrıştırıcı, atladığınız eksik noktalı virgül ekleyecektir , çünkü bu durumda ayrıştırıcı, dahil ettiğiniz noktalı virgül dikkate almayacaktır . Başka bir deyişle: biri isteğe bağlıysa, sekiz de öyle .
Noktalı virgül

"Adlandırılmış işlev ifadeleri belirsizleştirildi" bağlantısı artık ölü bir URL'ye bağlanıyor
Tony

Son örnek harika bir örnek. Bu durumda noktalı virgül atlamak son derece garip ve hata ayıklaması zor hatalara yol açar. Bütün kalbiyle oylama.
Yan Yankowski

38

Bunları değişken işlev bildirimlerinden sonra kullanırım:

var f = function() { ... };

ancak klasik stil tanımlarından sonra değil:

function f() {
    ...
}

NetBeans ve diğer IDE'ler, değişken gibi bir işlev olarak işlevden sonra noktalı virgül görmeyi sever. This.animaton_fun = function () {...};
Lance Cleveland

6
Ama - soru soran için - neden ?
Luke

yapım aşamasında yardımcı olur. Bir uglifier betiği noktalı virgül gördüğünde, çıkış dosyasına satır sonu eklemeye gerek yoktur, yoksa satır sonu oluşturulur ve dosya biraz daha büyük olur.
autoboxer

20

JS Lint fiili bir sözleşmedir ve işlev gövdesinden sonra noktalı virgül kullanmaz. Bkz "noktalı virgül" bölümüne.


10
Noktalı virgül eksikliği nedeniyle başarısız olan bir işleve ilk elden tanık oldum. Tamamen aynı fikirde değilim. Zamanın% 99,99'u kırılmasa da, IE'nin noktalı virgül olmadan JavaScript'i interpet edemediğini fark ettiğim bazı durumlar var.
MillsJROSS

8
Yanıtım yalnızca sorunun iki örneğindeki gibi işlev tanımlarıyla ilgilidir. Bu durumlarda, bir sonlandırma noktalı virgül de gerekli değildir herhangi içinde, tarayıcıda herhangi bir durum. Sanırım fonksiyon ifadelerini düşünüyor olabilirsiniz. Bunlar tamamen farklı bir konudur ve orijinal soruda ele alınan bir konu değildir.
David Hedlund

var myFunction = function (arg) {console.log (arg); } (function () {console.log ('tamamen ilgisiz işlev'); 'ne olduğuna bakın';} ());
Maciej Krawczyk

@MillsJROSS David'in yanıtını ikinci olarak verdim ve karşılaştığınız başarısızlığı ayrıntılandırırsanız çok mutlu olurum. Gerçekten bir fonksiyon ifadesi veya IE hatası mıydı?
wlnirvana

7

Sadece tutarlı olun! Bunlara gerek yok, ama ben şahsen kullanıyorum çünkü çoğu küçültme tekniği yarı kolon (örneğin Packer ) kullanıyor.


5

Gerçekten sadece tercihinize bağlıdır. Java, C ++, C #, vb için alışkınım, bu yüzden javascript kodlama için aynı standartları kullandığım için kod satırlarını noktalı virgüllerle bitirmek istiyorum.

Genellikle noktalı virgüllerde işlev bildirimlerini sonlandırmıyorum, ama bu sadece benim tercihim.

Tarayıcılar her iki şekilde de çalışacak, ancak belki bir gün bunu yöneten daha katı standartlar getirecekler.

Yazacağım kod örneği:

function handleClickEvent(e)
{
     // comment
     var something = true;  // line of code
     if (something)  // code block
     {
        doSomething();  // function call
     }
}

1
çizgiler kesinlikle noktalı virgülle sonlandırılmalıdır, tho. aksi takdirde bir küçültücü işlevselliği tamamen bozabilir
David Hedlund

9
@david: bu durumda madenci bozuldu mu?
DisgruntledGoat

Kabul. C / C ++ geçmişlerinden gelen insanlar (benim gibi) için kodlamanın doğal bir yoludur. Ayrıca kodu daha okunabilir hale getirir.
Anshuman Manral

3

Aslında bir konvansiyon veya tutarlılık meselesinden daha fazlası.

Bunu eminim değil o ifadenin ucunun nerede olduğunu anlamaya çünkü iç ayrıştırıcı aşağı tüm ifadelerle yavaşlatır sonra noktalı virgül koyarak. Bunu olumlu olarak onaylamanız için bazı kullanışlı numaralar olmasını dilerdim, ama belki de kendiniz google yapabilirsiniz. :)

Ayrıca, kodu sıkıştırırken veya küçültürken, noktalı virgül eksikliği, komut dosyanızın tüm beyaz boşluk gittiğinden, istediğinizi yapmayan küçültülmüş bir sürümüne yol açabilir.


3
Soru, noktalı virgüllerin işlevlerden sonra olması gerekip gerekmediği yönündeydi, her ifade değil. Her ifadeden sonra noktalı virgül koymanız gerektiğine katılıyorum ve aynı şeyi söyleyen başka yığın akışı mutabakatı gördüm.
macca1

1
Anlaşıldı ve işlevlerden sonra noktalı virgül koyulmaması, bahsettiğim bu küçültme sorunuyla sonuçlanacaktır. İyi şanslar efendim.
Mason

Minoks sorununu güçlendiren neden benim anlayışımı netleştirdi
JackW327

1

Betiklerimi küçültdüğümde eşittir işaretiyle başlayan işlevler için noktalı virgül kullanmam gerektiğini fark ettim. bir işlevi var olarak tanımlarsanız, evet noktalı virgül kullanmanız gerekir.

noktalı virgül lazım

var x = function(){};
var x = new function(){};
this.x = function(){};

noktalı virgül gerekmez

function x(){}

0

BASİT:

;İşlev parantezlerinin sona ermesinden sonra noktalı virgüllerin ayrılması iyi bir uygulamadır . Yıllardır en iyi uygulama olarak görülüyorlar.

Her zaman bunları kullanmanın bir avantajı, JavaScript'inizi küçültmek istiyorsanız.

Javascript küçültülürken, dosya boyutunu biraz azaltmaya yardımcı olur.

Ancak yukarıdaki en iyi uygulama ve cevap için, bir işlev etiketinden sonra kullanılması önerilmez.

Noktalı virgül KULLANMAYINIZ ve küçültmek istiyorsanız (geliştiricilerin siteleri çok fazla JavaScript sunuyorsa yapmak istedikleri gibi) her türlü Hata / Uyarıyı alabilirsiniz.


0

bir işlevden sonra noktalı virgül kullanmanız gerekip gerekmediği, programınızda hatalara neden olmaz. ancak, kodunuzu küçültmeyi planlıyorsanız, işlevlerden sonra noktalı virgül kullanmak iyi bir fikirdir. örneğin, aşağıdakine benzer bir kodunuz olduğunu varsayalım

//file one
var one=1;
var two=2;
function tryOne(){}
function trytwo(){}

ve

//file two
var one=1;
var two=2;
function tryOne(){};
function trytwo(){};

Her ikisini de küçültdüğünüzde, çıktı olarak aşağıdakileri elde edersiniz

Yorumların sadece halat için olduğunu unutmayın

//file one
var one=1;var two=2;function tryOne(){}
function trytwo(){}

ve

//file two
var one=1;var two=2;function tryOne(){};function trytwo(){};
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.