Bunun amacı closures
basitçe devleti korumaktır ; Bu nedenle adı closure
- devlet üzerinde kapatır . Daha fazla açıklama kolaylığı için Javascript kullanacağım.
Genelde bir işlevin vardır
function sayHello(){
var txt="Hello";
return txt;
}
değişken (ler) in kapsamı bu işleve bağlı. Dolayısıyla, yürütmeden sonra değişken txt
kapsam dışına çıkar. İşlev yürütmeyi bitirdikten sonra erişme veya kullanma yolu yoktur.
Kapanışlar, daha önce de belirtildiği gibi değişkenlerin durumunu korumaya ve böylece kapsamı uzatmaya izin veren dil yapısıdır.
Bu, farklı durumlarda faydalı olabilir. Bir kullanım durumu, daha yüksek dereceli fonksiyonların yapımıdır .
Matematik ve bilgisayar bilimlerinde, üst düzey bir işlev (ayrıca işlevsel biçim, işlev veya işlev) de aşağıdakilerden en az birini yapan bir işlevdir: 1
- giriş olarak bir veya daha fazla fonksiyon alır
- işlev çıktılar
Basit ama kabul edilebilir bir şekilde hepsi çok yararlı bir örnek değildir:
makeadder=function(a){
return function(b){
return a+b;
}
}
add5=makeadder(5);
console.log(add5(10));
makedadder
Bir parametreyi girdi olarak alan ve bir işlev döndüren bir işlev tanımlarsınız . Bir dış işlev function(a){}
ve bir iç function(b){}{}
kısım vardır. Bundan başka add5
, yüksek dereceli işlev çağrısının sonucu olarak başka bir işlevi de (dolaylı olarak) tanımlarsınız makeadder
. makeadder(5)
anonim ( iç ) bir işlev döndürür , bu da sırasıyla 1 parametre alır ve dış işlev parametresinin ve iç işlev parametresinin toplamını döndürür .
İşin püf noktası, asıl eklemeyi yapan iç işlevi döndürürken, dış işlev parametresinin ( a
) kapsamının korunmuş olmasıdır. add5
hatırlar parametresi olduğu, a
oldu 5
.
Veya en azından bir şekilde yararlı bir örnek göstermek için:
makeTag=function(openTag, closeTag){
return function(content){
return openTag +content +closeTag;
}
}
table=makeTag("<table>","</table>")
tr=makeTag("<tr>", "</tr>");
td=makeTag("<td>","</td>");
console.log(table(tr(td("I am a Row"))));
Diğer bir yaygın usecase, IIFE = hemen çağrılan işlev ifadesidir. Javascript'te özel üye değişkenlerini taklit etmek çok yaygındır . Bu, özel bir kapsam yaratan bir işlev aracılığıyla yapılır = closure
, çünkü tanımın çağrılmasından hemen sonra. Yapı function(){}()
. ()
Tanımdan sonra parantezlere dikkat edin . Bu, ifşa modül modeliyle nesne oluşturma için kullanılmasını mümkün kılar . İşin püf noktası, bir kapsam yaratıyor ve IIFE'nin yürütülmesinden sonra bu kapsama erişimi olan bir nesneyi döndürüyor.
Addi'nin örneği şuna benziyor:
var myRevealingModule = (function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
// Reveal public pointers to
// private functions and properties
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};
})();
myRevealingModule.setName( "Paul Kinlan" );
Döndürülen nesne, publicSetName
sırasıyla "özel" değişkenlere erişebilen işlevlere (örneğin ) başvurular içerir privateVar
.
Ancak bunlar Javascript için daha özel kullanım durumlarıdır.
Bir programcı kapatmanın en iyi şekilde yerine getirebileceği hangi özel görevi yerine getirir?
Bunun birkaç nedeni var. Biri, fonksiyonel bir paradigmayı takip ettiğinden dolayı, onun için doğal olabilir . Veya JavaScript: o sadece zorunluluktur dilin bazı kültürlerinden kaçınmak için kapanışları güvenmek.