Closure
Kapanış
- Okunuşu
- klojır
Kısaca
Closure, oluşturulduğu kapsamdaki değişkenleri hatırlayan bir fonksiyondur; dıştaki fonksiyon sona erdikten sonra bile bu değişkenleri kullanabilir.
Closure nedir?
Closure, bir fonksiyon başka bir fonksiyonun içinde tanımlanıp o dış fonksiyonun değişkenlerini kullandığında oluşur. İçteki fonksiyon bu değişkenlerin kopyasını değil referansını tutar; bu sayede dış fonksiyon işini bitirdikten sonra bile onları okuyabilir ve güncelleyebilir. JavaScript'te her fonksiyon, tanımlandığı kapsam üzerinde bir closure oluşturur.
Closure'lar sözcüksel kapsam (lexical scoping) sayesinde çalışır. Bu, bir fonksiyonun değişkenlere erişiminin nereden çağrıldığına değil, kodda nerede yazıldığına göre belirlenmesi demektir. Dış fonksiyon bittiğinde değişkenleri normalde atılırdı; ancak içteki bir fonksiyon hâlâ onlara başvuruyorsa bellekte yaşamaya devam ederler.
Closure için yararlı bir benzetme sırt çantasıdır: bir fonksiyon oluşturulduğunda çevresindeki değişkenleri çantasına koyar ve gittiği her yere taşır. Closure'lar özel durum (dışarıdaki kodun doğrudan erişemediği veri), fonksiyon fabrikaları, olay işleyicileri ve bağlamı hatırlaması gereken callback'ler için kullanılır.
Closure sıklıkla callback ile karıştırılır. Callback, daha sonra çağrılmak üzere başka bir fonksiyona verilen fonksiyondur; closure ise bir fonksiyonun çevresindeki değişkenleri hatırlamasıyla ilgilidir. Birçok callback aynı zamanda bir closure'dır, ancak iki terim farklı fikirleri anlatır.
Bir bakışta
Önemli noktalar
- Closure, bir fonksiyon ile onun çevre kapsamdan yakaladığı değişkenlerin bütünüdür.
- Yakalanan değişkenler, closure var olduğu sürece yaşamaya devam eder.
- Closure'lar değişkenleri referansla yakalar, bu yüzden her zaman en son değeri görür.
- Özel durum, fonksiyon fabrikaları ve bağlamı hatırlayan callback'ler için olanak sağlar.
Örnek
// makeCounter returns a function that "closes over" count
function makeCounter() {
let count = 0; // private: not reachable from outside
return function () {
count += 1; // the inner function still has access
return count;
};
}
const counter = makeCounter();
counter(); // 1
counter(); // 2 (count was remembered between calls)Sık sorulan sorular
Closure'lar neden yararlıdır?
Closure'lar, bir fonksiyonun global değişken kullanmadan çağrılar arasında özel durum tutmasını sağlar. Sayaçlar, memoization (sonuçları önbelleğe alma) ve hangi veriye ait olduğunu hatırlayan olay işleyicileri gibi kalıpların temelidir.
Closure ile callback arasındaki fark nedir?
Callback, daha sonra çağrılabilsin diye başka bir fonksiyona verdiğiniz fonksiyondur. Closure ise oluşturulduğu yerdeki değişkenleri hatırlayan fonksiyondur; callback çoğu zaman bir closure'dır, ancak terimler farklı şeyleri anlatır.
Closure'lar bellek sızıntısına yol açabilir mi?
Hiç kaldırılmayan bir olay dinleyicisi gibi uzun ömürlü bir closure, artık gerekmeyen büyük nesnelere referans tutmaya devam ediyorsa açabilir. Kullanılmayan dinleyicileri kaldırmak ve gereksiz yakalanan verilerden kaçınmak bunu önler.
İlgili sayfalar
- FonksiyonProgramlamanın Temelleri, s. 20Fonksiyon, belirli bir işi yapan, isteğe bağlı olarak parametre denen girdiler alıp sonuç döndürebilen, adlandırılmış ve yeniden kullanılabilir kod bloğudur.
- DeğişkenProgramlamanın Temelleri, s. 10Değişken, bir programda sayı ya da metin gibi bir değeri tutan ve kodun çalışırken okuyup değiştirebildiği, adlandırılmış bir depolama alanıdır.
- CallbackProgramlamanın Temelleri, s. 5Callback, başka bir fonksiyona argüman olarak verilen ve o fonksiyonun bir iş bittiğinde ya da bir olay gerçekleştiğinde sonradan çağırdığı fonksiyondur.
- Çöp toplamaProgramlamanın Temelleri, s. 9Çöp toplama, dil çalışma zamanının programın artık kullanamadığı verileri bulup bu belleği yeniden kullanıma açtığı otomatik bellek yönetimidir.
- JavaScriptWeb Geliştirme, s. 25JavaScript, web tarayıcılarında sayfaları etkileşimli hale getiren ve Node.js gibi çalışma ortamlarıyla sunucularda da çalışan programlama dilidir.
- KapsamProgramlamanın Temelleri, s. 32Kapsam, bir programda değişken ya da fonksiyon gibi bir adın görünür olduğu ve kullanılabildiği bölgedir; her kod satırının nelere ulaşabileceğini belirler.
Kaynaklar
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin