JavaScript Kapanımları ve Kendini Çağıran Fonksiyonlar


27 Ağustos 2012     Etiketler: JavaScript

JavaScript dilindeki kapanım (closure) kavramını en kısa şekilde izah etmek herhalde fonksiyon içinde fonksiyon tekniği ile dış etkenlere karşı korunmalı modüler yapılar oluşturmak tanımı ile mümkün olur. Programcılar olarak bazen hal ve durum takibi amacıyla yazdığımız JavaScript fonksiyonlarının dışında global kapsamlı değişkenler yaratırız


Bu makale ilk olarak F5 Dergi Haziran-Temmuz 2012 sayısında yayınlanmıştır. F5 Dergi'ye ücretsiz olarak abone olabilirsiniz.


Aşağıdaki kod parçası bu duruma bir örnektir.


var say = 0; //hal ve durum takibi amaçlı global kapsamlı değişken

function açikMetot() {

    say++;

    alert(say);

}

açikMetot(); //say=1

açikMetot(); //say=2

Kapanımların faydalarını ve getirilerini anlayabilmek için yukarıdaki kod parçasındaki problemleri inceleyelim.


Problem 1
: Çözümün taşınabilirliği az… açikMetot fonksiyonunun sağladığı işlevi başka bir yere taşımak istersek var say = 0; satırını da taşımamız gerekecektir. Yani açikMetot fonksiyonunun sağladığı işlev modüler değildir. Sayfa üzerinde say ve açikMetot ikilisi gibi onlarca global kapsamlı değişken ve fonksiyon ikilisi olabileceğini göz önünde bulundurursak bu “modüler olmama” özelliği hiç istenen bir durum değildir.


Problem 2: say değişkeni global kapsamlı olmasından ötürü dış etkenlere karşı korunmasızdır. Ayrıca aynı ortamda yüklenen farklı JavaScript ünitelerinde aynı isimle deklare edilebilecek başka bir değişken olması durumunda bir JavaScript hatası oluşacaktır.


Şimdi yukarıdaki mekanizmayı aşağıdaki şekilde değiştirelim.

function kapanım() {

    var say = 0; //özel (private) değişken

    this.metot = function() {

       say++;

       alert(say);

    }

}

var kapanım = new kapanım();

kapanım.metot(); //say=1

kapanım.metot(); //say=2


Burada dikkat edilmesi gereken önemli noktalar:

- kapanım() metodunun nesne yönelimli dillerdeki sınıf kavramına benzer şekilde yaratılmış olması,

- metot adlı bir public metot ve

- say adlı bir private değişkene sahip olması.

Sonuç itibarıyla bir kapanım şeklinde yeniden yazdığımız kod bize aynı işlevi sağlamakla birlikte, taşınabilir ve dış etkenlerden korunmuş bir durumda olmasından dolayı da, yukarıda sıraladığımız problemlerden arınmış olmaktadır.

Kapanım tekniği ile beraber kullanılabilen bir diğer JavaScript tekniği de kendini çağıran fonksiyonlardır. Bu tip fonksiyonlar deklarasyonlarının hemen akabinde kendilerini çağırmak suretiyle otomatik olarak çalışırlar. Aşağıdaki kod parçalarını inceleyelim.


Normal Fonksiyon         


function normalFonksiyon(mesaj) {
   alert(mesaj); 
}

normalFonksiyon('çalışıyor');



Kendini Çağıran Fonksiyon

(function kçFonksiyon(mesaj) {
   alert(mesaj);
})('çalışıyor');


Yukarıdaki iki ifade işlevsel olarak birbirine denktir. Kendini Çağıran Fonksiyon örneğinde dikkat edilmesi gereken iki nokta şöyledir:

- kçFonksiyon’nun ( ve ) ile çevrelenmiş olması ve

- ('çalışıyor'); tarafından takip edilmesinden dolayı otomatik olarak kendini çağırarak derhal çalışması

Kapanımlar ve Kendini Çağıran Fonksiyonların beraber kullanımı ile net, etkin ve modüler çözümler üretmek mümkün olacaktır. Bu iki tekniğin beraber kullanıldığı basit bir faiz hesaplayıcı yapısıyla makalemizi noktalayalım.

var faizHesaplayıcı = (function () {

     var faizOranı = 0.15;

     this.toplamHesapla = function (anapara) {
       
return anapara + (anapara * faizOranı)
     };

return this;

})();

Yukarıdaki örnekte faiz hesabı yapan fonksiyonu adsız bir kapanım fonksiyonu içinde topladık, faizOranı’nı dış etkenlerden etkilenmeyecek bir şekilde özel bir değişken olarak tanımladık ve bu yapıyı kendini çağıran fonksiyon olarak yazdık. Adsız fonksiyon derhal çalışacak ve faizHesaplayıcı değişkenine kendisini aktaracaktır. Böylece faizHesaplayıcı.toplamHesapla(100) şeklinde toplamHesapla metodu çağırılabilecektir.




Yorumlar


takdire layik
f5 @ 13.9.2012 00:02:46

güzel anlatım olmuş, elinize/zihninize sağlık.
sam @ 11.10.2012 11:05:41

gayet güzel
Mustafa @ 6.5.2013 08:18:46

Sizin yorumunuz

Email


Adınız







F5 Dergi © 2017