C # 's lambda ifadesi de kapanışlara sahiptir ancak C # toplulukları veya kitapları tarafından nadiren tartışılmaktadır. C # dünyasında olduğundan çok daha fazla JavaScript insanının ve kitabının kapanışları hakkında konuştuğunu görüyorum . Neden?
C # 's lambda ifadesi de kapanışlara sahiptir ancak C # toplulukları veya kitapları tarafından nadiren tartışılmaktadır. C # dünyasında olduğundan çok daha fazla JavaScript insanının ve kitabının kapanışları hakkında konuştuğunu görüyorum . Neden?
Yanıtlar:
Javascript ad alanları gibi bir özelliğe sahip olmadığından ve her türlü küresel nesne ile kolayca karışabilirsiniz.
Bu nedenle, kendi yürütme ortamında bazı kodları izole edebilmek önemlidir. Kapatma bunun için mükemmeldir.
Kapanmanın bu kullanımı, kodları izole etmek ve her şeyi küresel kapsama sokmamak için ad alanlarınız, sınıflarınız vb.Gibi C # gibi bir dilde mantıklı değildir.
Javascript kodu için çok yaygın bir uygulama bunu şöyle yazıyor:
(function(){
// Some code
})();
Gördüğünüz gibi, bu anonim bir işlev bildirimidir ve hemen ardından yürütülür. Bu nedenle, işlev içinde tanımlanan her şeye dışarıdan erişmek imkansızdır ve küresel kapsamı bozmayacaksınız. Bu işlevin yürütme bağlamı, bazı kodlar, bu bağlamda tanımlanan iç içe işlevler gibi, geri arama veya her türlü iletebildiğiniz sürece canlı kalacaktır.
Javascript, C # 'dan çok farklı bir dildir. Nesne yönelimli değil, prototip yönelimli. Bu, sonunda çok farklı uygulamalara yol açar.
Neyse, kapaklar iyi, bu yüzden onları kullanın, hatta C #!
DÜZENLEME: Bazıları stackoverflow'un sohbeti hakkında konuştuktan sonra, bu anwer'ın kesin olması gerektiğini düşünüyorum.
Örnek koddaki işlev bir kapatma değildir. Ancak, bu işlev yerel değişken ve iç içe işlevleri tanımlayabilir. Bu yerel değişkenleri kullanan tüm iç içe geçmiş işlevler kapanır.
Bu, küresel kapsamı bozmadan bazı işlevleri bir dizi işlev arasında paylaşmak için kullanışlıdır. Javascript'te en sık kullanılan kapak kullanımı budur.
Kapanış, böyle bazı verileri paylaşmaktan çok daha güçlüdür, ancak gerçekçi olalım, çoğu programcı fonksiyonel programlama hakkında bir şey bilmiyor. C # 'da bu tür bir kullanım için sınıf veya bir ad alanı kullanırdınız, ancak JS bu işlevselliği sağlamaz.
Kapatma ile küresel kapsamı korumaktan daha fazlasını yapabilirsiniz, ancak JS kaynak kodunda göreceğiniz şey budur.
Muhtemelen JavaScript'in nesne yöneliminin popüler uygulamaları kapanışlara bağlıdır. Basit bir örneğe bakalım:
function counter() {
var value = 0;
this.getValue = function() { return value; }
this.increase = function() { value++; }
}
var myCounter = new counter();
console.log(myCounter.getValue());
myCounter.increase();
console.log(myCounter.getValue());
Yöntemler getValue
ve increase
aslında değişkeni kapsülleyen kapanışlardır value
.
Çünkü JavaScript'i 'katlanılabilir' yapan kitaplıkların çoğu bunları kullanıyor.
Sadece üç popüler olan JQuery , Prototype veya MooTools'a bir göz atın . Bu kitaplıkların her biri, each
koleksiyonları için tercih edilen yineleme yolu olarak bir yineleyici işlevi kullanan bir yöntem sağlar . Bu işlev, dış kapsamdaki değerlere erişirken bir kapatma olacaktır:
[1,2,3].each(function(item) {
console.log(item);
});
Ve burada bitmiyor: Ajax'ta geri aramalar, Ext.js'de olay işleme, vb. İşlevlerin tümünü alır ve kodunuzu tam olarak bir kez çağrılan 100 işlevli işlevlerle şişirmek istemiyorsanız, kapanışlar yoludur.
console.log
dış bir kapsamda tanımlanır, console
bir 'serbest değişken' de tanımlanır. Ve aslında, neden farklı bir şey olmayan bir for-loop, kötü bir uygulama?
JavaScript ile "iyi" kodlamanın daha fazla kapanmaya bağlı olduğu diğer cevaplara katılıyorum. Bununla birlikte, buna ek olarak, muhtemelen her bir dilde özelliğin ne kadar süredir devam ettiği sorusudur. JavaScript, ilk uygulamalarından bu yana temelde kapanışlara sahiptir. Öte yandan C #, 3.0'dan beri sadece Visual Studio 2008 ile piyasaya sürüldü.
Çalıştığım birçok C # programcısı hala 2.0 proje üzerinde çalışıyor. 3.0 veya 4.0 sürümlerinde çalışıyor olsalar da, hala 2.0 deyim kullanıyorlar. Kapakları seviyorum; umarım konsept C # geliştiricileri arasında yayıldıkça C # 'da daha çok kullanılırlar.
Bunun ana nedeni, C # 'ın statik olarak yazılması ve işlevlerin yalnızca, kapakların kullanışlılığını engelleyen önceden belirlenmiş tek bir ortama erişimi olmasıdır.
Öte yandan, JavaScript'te, kapaklar işlevlerin bir nesne özelliği olarak erişildiğinde ve birinci sınıf nesneler olarak yöntem olarak davranmasını sağlar, ayrıca alt rutinlerin farklı bağlamlarda çalışmasına izin veren farklı ortamlara da enjekte edilebilir.
Onları öğrenmek zorunda olmamın bir nedeni, DOM öğelerinde (veya gerçekten herhangi bir şeyde) döngü yaparken, değişken kapsamı "kapatabilme" veya "kapsülleyebilmeniz" gerektiğiydi. Burada yayınlanan örnekte olduğu gibi: /programming/5606059/how-to-create-closure-in-loop-and-store-it-in-variable-for-later-execution