Anında işlev çağırma sözdizimi


110

Aslında İyi Parçalardan biri olan bir JSLint seçeneği vardır, "acil çağrıların etrafına parantezler [gerektirir]", yani yapı

(function () {

  // ...

})();

bunun yerine şöyle yazılması gerekir

(function () {

  // ...

}());

Sorum şu - bu ikinci formun neden daha iyi kabul edilebileceğini kimse açıklayabilir mi? Daha dayanıklı mı? Daha az hata eğilimli? İlk forma göre ne gibi bir avantajı var?


Bu soruyu sorduğumdan beri, fonksiyon değerleri ile fonksiyonların değerleri arasında net bir görsel ayrım yapmanın önemini anladım. Anında çağrılmanın sonucunun bir atama ifadesinin sağ tarafı olduğu durumu düşünün:

var someVar = (function () {

  // ...

}());

En dış parantezler sözdizimsel gereksizdir rağmen, açma parantez atanan değer olduğu bir yukarı-ön göstergesidir verir değil işlevi kendisini değil işlevinin sonucu olarak çağrı yapılmaktadır.

Bu, Crockford'un yapıcı işlevlerinin büyük harf kullanımına ilişkin tavsiyesine benzer - kaynak koduna bakan herkese görsel bir ipucu olarak hizmet etmesi amaçlanmıştır.


Bunu işaret ettiğiniz için teşekkürler. JSLint'in "Bir döngü içinde işlevler yaparken dikkatli olun" uyarı mesajından nasıl kurtulacağımı hiçbir zaman bulamadım. Dikkatli davrandım ve işlevi kapattım ancak JSLint yine de şikayet etti. Şimdi ikinci kalıbı kullandığımı varsaydığımı biliyorum.
viam0Zah


Bunca zamandır "yanlış" yapıyorum. Ve "bunca zaman"
Dave Land

Yanıtlar:


73

Douglass Crockford'un stil sözleşmesi kılavuzundan : ("hemen çağrılır" için arama yapın)

Bir fonksiyon hemen çağrılacağı zaman, tüm çağrı ifadesi parantez içine alınmalıdır, böylece üretilen değer fonksiyonun kendisinin değil fonksiyonun sonucudur.

Yani, temelde, fonksiyon değerleri ile fonksiyonların değerleri arasındaki ayrımı daha net hale getirdiğini düşünüyor. Yani, bu biçimsel bir mesele, kodun kendisinde gerçekten önemli bir farklılık değil.

güncellenmiş referans, eski PPT artık mevcut değil


1
Bunu okuduğuma sevindim. Javascript: The Good Parts'ı yeni bitirdim ve düşünmeye devam ettiğim şey, bir işlevi çağırmanın sonucunu atamanın gerçekten kötü sözdizimi olduğuydu, çünkü neler olduğunu anlamak için ilk ve son satırlara bakmanız gerekiyor. Kitaptaki sarma parantezlerini kullanmıyor ama neden onları önerdiğini tam olarak anlıyorum.
Skilldrick

2
@altCognito, PPT için yeni bir bağlantı sağlayabilir misiniz?
th1rdey3

1
Web'e baktım, ancak yine de o
PPT'nin

1
Orijinal PPT'yi bulamadım, ancak javascript kural kılavuzunda bulunan noktayı bulabildim.
cgp

archive.org'da var mı?
John Greene

2

Hemen Anonim İşlevler olarak adlandırılan parantez içine alınır, çünkü:

  1. Bunlar işlev ifadeleridir ve parensleri dışarıda bırakmak, bir sözdizimi hatası olan bir işlev bildirimi olarak yorumlanmasına neden olur.

  2. İşlev ifadeleri işlev sözcüğü ile başlayamaz.

  3. İşlev ifadesini bir değişkene atarken, işlevin kendisi döndürülmez, işlevin dönüş değeri döndürülürdolayısıyla parenler içlerinde ne olduğunu değerlendirir ve bir değer üretir.işlev yürütüldüğünde ve sondaki parenler ..}()işlevin hemen yürütülmesine neden olur.


Dathan, farklı bir soruyu cevaplıyorsun. Ayrıştırıcının işlev ifadelerini işlev bildirimlerinden ayırt edebilmesi için çevreleyen parantezlerin bazen sözdizimsel olarak gerekli olduğu konusunda haklısınız. Ancak sorum çağrı parantezlerinin yerleştirilmesiyle ilgili. Üçüncü noktanız yanlış; bu durumda çevreleyen parantezler gereksizdir.
Bobby Eickhoff

Anonim Anonim Fonksiyonun bir değişkene atanmadığı ve bu nedenle ilk 2 nedenden dolayı parantezlerin sözdizimsel olarak gerekli olduğu ilk örneğinizi yanıtlıyordum. Üçüncü neden, söylediğiniz şeyi eski haline getirmekti: "açılış parantezi, atanan değerin işlevin kendisi değil, daha çok çalıştırılan işlevin sonucu olduğunu açıkça gösterir." Ama sanırım net değildi.
Dathan

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.