Anonim işlev ve jquery'de başlatma için ayrı adlandırılmış işlev


9

Diyelim ki bir sayfa yüklendiğinde bir şeyleri başlatmak için kullanılan bir kodumuz var ve şöyle görünüyor:

function initStuff() { ...}
...
$(document).ready(initStuff);

İnitStuff işlevi, snippet'in yalnızca üçüncü satırından çağrılır. Bir daha asla. Yani genellikle insanlar bunu böyle anonim bir geri çağrıya koyarlar:

$(document).ready(function() { 
    //Body of initStuff
});

İşlevin kodda özel bir konuma sahip olması, okunabilirliğe gerçekten yardımcı olmaz, çünkü ready () çağrısı ile bunun başlatma kodu olduğu açıktır.

Birini diğerine tercih etmek için başka nedenler var mı?


4
Birincisi, küresel ad alanını dağıtır. İkincisini seçin.
riwalk

Yanıtlar:


10

@ Stargazer712'in belirttiği gibi, birincisi küresel ad alanını dağıtır, ikincisi kazanan IMHO'dur. Şimdi, ikinci örnekte anonim bir işlev kullandığınız için, hata ayıklayıcınızın calltack'i işe yaramaz olacak ve kullandığınız hata ayıklayıcıya bağlı olarak farklı sonuçlar alacaktır. Genelde, sonuçta ben:

$(document).ready(function MODULE_init() { 
    //Body of initStuff
});

Bu şekilde, genel ad alanı karmaşıklaşmaz ve yararlı bir çağrı kaydınız olur.

Yukarıdaki kuralları tüm anonim (artık anonim değil;)) işlev tanımlarında kullanma eğilimindeyim. Firefox JS koduna göz atarken bulduğum bir kural.

Edit: Şimdi tüm bunları söyledikten sonra, Oliver birim testleri ile iyi bir noktaya getiriyor. Yukarıdaki, bir ton test edilmemiş kod barındırmak için değil, daha karmaşık operasyonlar için bir sargı görevi görmektedir.


+1 Hata ayıklamadan bahsetmek için. Sık sık Node.js kodu "adlandırılmış geri aramalar" (bu terim gerçekten var olup olmadığını bilmiyorum) kullanımını gördüm, bu yüzden çok iyi bir uygulama sanırım.
Oliver Weiler

kangax.github.com/nfe Adlandırılmış İşlev ifadeleri - Bu makale size onlar hakkında bilmek istediğiniz her şeyi anlatır.
Sean McMillan

7

Bu durumda muhtemelen önemli olmadığını söyleyebilirim, ancak anonim geri çağrı işlevleri varsa, diğer anonim geri çağrı işlevlerini çağırarak, kodu çok daha okunaklı ve takip etmeyi kolaylaştırdığı için ilk yaklaşımı kullanma eğilimindeyim.

Birim testi ile ilgili olarak, ilk yaklaşım daha iyi olurdu, çünkü initstufffonksiyonu tek başına test edebilirsiniz .


Genellikle bu başlatma işlevlerinde çok fazla kodumuz yoktur. Birkaç yerden bazı veriler getirebilir ve hepsi bu kadar
Martin N.

3

İlk olarak, okunabilirlik / hata ayıklama / test vb. İçin giderdim. Sayfanızdaki tüm işlevler için yerel bir ad alanı oluşturarak global ad alanı dağınıklığı sorununu önleyebilirsiniz. Paul Irish tarafından önerilen nesne gösterim stilini kullanıyorum ( http://paulirish.com/2009/perf/ adresindeki 13-15. Slaytlara bakın )

var MYPAGE = {
  onReady : function(){
  // init code
  },
  someOtherCallback : function(){}
};

jQuery(document).ready(MYPAGE.onReady);

2

Ayrıca ben tercih küresel ad alanı dağınık olmadan init yöntemleri kaydetme üçüncü yolu var:

jQuery(function(){....});

Kısa ve DOM doküman araması gibi

jQuery(document).ready(function(){...}); 

yapar.


+1: Bunun standart bir uygulama olduğunu düşünüyorum, ancak $tercih ettiğim çelişkili tanımlarla ilgili herhangi bir problemden kaçınmak için :jQuery(function($) {...});
kevin cline
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.