JavaScript'te Closures (Kapanışlar)

JavaScript'te kapanışlar (closures), bir iç içe fonksiyon yapısında dıştaki bir fonksiyonun içteki fonksiyonun kapsamındaki değişkenlere erişebilmesini sağlayan bir yapıdır. Bir fonksiyon, kendi tanımlandığı kapsamı (scope) dışında tanımlandığı kapsamı hatırlayabilir ve erişebilir.

Kapanışların Özellikleri

  1. İç İçe Fonksiyonlar: Kapanışlar genellikle bir fonksiyonun içerisinde başka bir fonksiyon tanımlanmasıyla oluşturulur.

    function dısFonksiyon() {
        let disDegisken = 'Dış Değişken';
        
        function icFonksiyon() {
            console.log(disDegisken);
        }
        
        icFonksiyon();
    }
    
    dısFonksiyon();
    
  2. Dıştaki Değişkenlere Erişim: İç fonksiyonlar, dış fonksiyondaki değişkenlere erişebilir.

    function sayac() {
        let deger = 0;
    
        function artir() {
            deger++;
            console.log(deger);
        }
    
        return artir;
    }
    
    let sayacFonksiyonu = sayac();
    sayacFonksiyonu(); // 1
    sayacFonksiyonu(); // 2
    sayacFonksiyonu(); // 3
    
  3. Kapsamın Korunması: Dış fonksiyon tamamlandıktan sonra bile kapanış, dış değişkenlerine erişmeye devam edebilir.

    function bekletilenFonksiyon() {
        let deger = 10;
    
        setTimeout(function() {
            console.log(deger);
        }, 1000);
    }
    
    bekletilenFonksiyon();
    
  4. Pratik Kullanım: Kapanışlar, fonksiyonların içteki durumlarını koruyarak çeşitli tasarım desenlerinde ve asenkron programlama gibi senaryolarda kullanışlı olabilir.

    function logger(isim) {
        return function(mesaj) {
            console.log(`[${isim}] ${mesaj}`);
        }
    }
    
    let kullaniciLogger = logger('Kullanıcı');
    kullaniciLogger('Giriş yapıldı');
    kullaniciLogger('Çıkış yapıldı');
    

Sonuç

Kapanışlar, JavaScript'in fonksiyonel yapısının önemli bir öğesidir ve kodun okunabilirliğini artırabilir, değişkenlerin güvenliğini sağlayabilir ve asenkron programlamada işleyişi kolaylaştırabilir. Kapanışların doğru bir şekilde kullanılması, JavaScript kodunun verimli ve etkili bir şekilde yazılmasını sağlayabilir.