Büyük anonim işlevleri neden argüman olarak diğer işlevlere aktarmak JavaScript'te bu kadar yaygın kabul görüyor?


27

Bir var görüş diğer fonksiyonlara argüman olarak kod birkaç satır daha içerirler anonim fonksiyonlar, geçen Ben öyle olacağına hissetmek noktasına, büyük ölçüde okunabilirliği ve kendini belgeleri etkilediğini (Eminim bazıları tarafından paylaşılacaktır am) Muhtemelen isminin sadece isimlendirilmiş bir işlev ilan etmesi için kodu kullanan herkes için çok daha iyi olun. Veya en azından ana işlevi bildirmeden önce bu isimsiz işlevi bir değişkene atayın.

Ancak, yalnızca birkaç örnek vermek için birçok JavaScript kütüphanesi (jQuery, d3.js / NVD3.js), bu şekilde büyük işlevleri kullanır.

Bu neden JavaScript'te bu kadar yaygın kabul görüyor? Kültürel bir şey mi, yoksa isimlendirdiğim bir işlevi ilan etmekten daha fazla tercih edilmesini sağlayan, kaçırdığım avantajlar var mı?


1
Muhtemelen kapak kullanımıyla ilgili çok şey var . Asıl işlevi dış dünyaya açıklamak istememekle de uğraşmak zorunda kalabilir (bu yüzden isimsizdir).
Robert Harvey,

3
@RobertHarvey Başka bir deyişle, JavaScript'in genel ve özel olmaması için geçici bir çözüm bu mu?
Mason Wheeler

2
Birçok yerde büyük bir anonim işlev bir blok gibi daha fazla okunur ve buna alışınca genellikle kendini iyi hisseder. Kapsam belirleme kuralları bile blok hissini desteklemektedir.

5
@MasonWheeler: Bu senin bakış açına bağlı. Bir Şema veya ECMAScript programcısı bunu söyleyebilir publicve privateuygun kapanmalara sahip olmadığı için geçici çözümler olabilir .
Jörg W Mittag

1
@ JörgWMittag XKCD 927'nin resmi dil sponsoru olan Racket for Racko!
Mason Wheeler

Yanıtlar:


23

Düşünebilmemin üç ana nedeni:

  1. Ana Kapsam Erişimi
  2. Gizlilik
  3. Yüksek kapsamlarda tanımlanan adların azaltılması

Üst Kapsam Kapsamı Erişimi: Satır içi işlev tanımları satır içi kodunun üst kapsamlarda tanımlanan değişkenlere erişmesine izin verir. Bu, birçok şey için çok faydalı olabilir ve uygun şekilde yapıldığında kodun miktarını veya karmaşıklığını azaltabilir.

Kodu, bu kapsamın dışında tanımlanan bir işleve koyar ve sonra bu kodu çağırırsanız, işleve erişmek istediği herhangi bir üst durumu iletmeniz gerekir.

Gizlilik: Satır içi anonim bir tanım içindeki kod daha özeldir ve başka bir kodla aranamaz.

Yüksek kapsamlarda tanımlanmış adların azaltılması: Bu, genel kapsamda çalışırken en önemlidir, ancak satır içi adsız bir bildirim, geçerli kapsamda yeni bir sembol tanımlamak zorunda kalmaz. Javascript doğal olarak isim alanlarının kullanılmasını gerektirmediğinden, asgari olarak gerekenden daha fazla genel sembol tanımlamaktan kaçınmak akıllıca olacaktır.


Editör: Javascript'te, isimsiz olarak satır içi bir şey bildirmenin, bir işlevi tanımlamaktan ve ana kapsam erişimi kullanılmadığında bile onu çağırmaktan bir şekilde "daha iyi" olarak kabul edildiği kültürel bir şey haline gelmiş gibi görünmektedir. Bunun başlangıçta Javascript'teki küresel isim alanı kirliliği probleminden ve belki de gizlilik problemlerinden dolayı olduğunu düşünüyorum. Fakat şimdi kültürel bir şeye dönüşmüştür ve kamuoyunda birçok kodda (bahsettiğiniz gibi) ifade edildiğini görebilirsiniz.

C ++ gibi dillerde çoğu muhtemelen birçok sayfa / ekrana yayılan dev bir işleve sahip olmanın ideal olmayan bir uygulama olduğunu düşünür. Tabii ki, C ++ yerleşik isim alanına sahiptir, ebeveyn kapsamı erişimi sağlamaz ve gizlilik özelliklerine sahiptir, bu nedenle tamamen okunabilirlik / bakım kolaylığı ile motive edilebilir, Javascript kod ifadesini gizlilik ve ebeveyn kapsamı erişimi sağlamak için kullanmak zorundadır. Dolayısıyla, JS farklı bir yönde motive olmuş gibi görünmektedir ve bu yönü motive eden şeyler belirli bir durumda gerekmediğinde bile, dilde kültürel bir şey haline gelmiştir.


Bir C ++ geliştiricisi yakın zamanda benim işimin birçoğu için JS'ye taşındığından, bu cevap, özellikle 'ana kapsam erişim' noktası için çok mantıklı geliyor - kodunuzu büyük ölçüde basitleştirecek güce sahip. Bir nitpick - C ++, C ++ 11 lambdas'ta ebeveyn kapsamı erişimi sağlar :) Kesinlikle +1.
Komutan Coriander Salamander

8

Anonim işlevler, JavaScript'te çoğu dilde olduğundan çok daha fazla amaç için kullanılır.

Öncelikle, ad alanları ve blok kapsamları için kullanılırlar. Yakın zamana kadar, JavaScript, Modül Deseni aracılığıyla bu işlevselliği sağlamak için adsız işlevlerin kullanılmasına yol açan modüllerden ya da başka bir tür adlandırma mekanizmasından yoksundur. Bu fonksiyonların isimlendirilmesinde kesinlikle bir faydası olmaz. Daha küçük bir ölçekte, JavaScript'in yakın zamana kadar blok kapsamı yetersizliği nedeniyle, blok kapsamını taklit etmek için benzer bir desen kullanılmıştır; en önemlisi halkaların gövdesinde. Bu durumda adlandırılmış bir işlev kullanmak, aktif olarak engelleyici olacaktır.

İkincisi ve daha az JavaScript'e özgü, adsız işlevler genellikle denetim yapılarını taklit eden daha yüksek dereceli işlevlerle kullanılır. Örneğin, jQuery'nin eachyöntemi. Her döngü gövdesini veya if-dalını birkaç satırdan uzun sürdüğünde bir işleve soyutladığınızdan şüpheleniyorum. Bu durumda aynı mantık geçerlidir.

Nihai bir neden, istemeden devam etmeyen bir stil koduna yol açma eğiliminde olan JavaScript'te olay tabanlı programlama yaygındır . Bir AJAX araması yaparsınız ve geri çağrılırsa, yürütüldüğünde başka bir AJAX araması yapar ve bir geri aramayı kaydeder vb. . Yine, birkaç satırlık düz kod satırını bir işleve soyutlatacağınızdan şüpheliyim.

Kültürel faktörler de vardır ve diğerlerinin yanı sıra yukarıda belirtilen nedenlerden dolayı, adsız işlevler JavaScript'te diğer dillerden çok daha yaygındır ve diğer dillerden daha rahat / gevşek kullanılır.


Kendim, belki de C ++ kodlamadaki naif yapılar bazen olay tabanlı kodlama prensiplerini ve JavaScript'ten std :: function ve lambdas ile geri arama ilkelerini almıştır. Benim durumum, kısmen çünkü C ++ 'da UI kodu yapıyorum ve engelleme işlemleri yapmak istemiyorum. JavaScript'in uygulamalarının, dili iyi desteklediği sürece herkes için yararlı olup olmadığını merak ediyorum.
Katana314
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.