Ana içeriğe geç

Closure

Kapanış

Okunuşu
klojır
Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/closure

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

Bir closure: makeCounter() sona ermiştir, ancak geri verdiği iç fonksiyon olan counter, count değişkenine bir referans tutar; bu yüzden counter()'ın her çağrısı aynı count'u önce 1'e, sonra 2'ye günceller.makeCounter()sona erdidöndürürreferans tutarcount0 → 1 → 2bellekte kalırcounteriçteki fonksiyoncounter() → 1counter() → 2
Dış çağrı bitmiştir, ama count yaşamaya devam eder; çünkü döndürülen fonksiyon hâlâ ona başvurur.

Ö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

Closure ile yazılmış bir sayaçjavascript
// 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

Kaynaklar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar