Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi

JavaScript closure nedir?​


JavaScript closure, bir fonksiyonun oluşturulduğu dış kapsamdaki değişkenlere, o kapsamın çalışması sona erse bile erişmeye devam etmesidir. Başka bir deyişle fonksiyon yalnızca kendi kodunu değil, tanımlandığı yerdeki değişken ortamına yapılan referansı da taşır. Bu özellik; özel durum tutmak, sayaç oluşturmak, fabrika fonksiyonları yazmak ve asenkron işlemlerde doğru değeri korumak için kullanılır.

Closure nasıl çalışır?​


İç içe bir fonksiyon, dış fonksiyonun değişkenini kullandığında JavaScript bu değişkeni yalnızca çağrı anında aramaz; iç fonksiyonun erişebileceği kapsam zincirinde tutar. Dış fonksiyon return ile tamamlanmış olsa bile, döndürülen iç fonksiyon yaşamaya devam ediyorsa gerekli değişkene erişebilir.

Kod:
function sayaçOlustur() {
  let değer = 0;

  return function () {
    değer += 1;
    return değer;
  };
}

const say = sayaçOlustur();

console.log(say()); // 1
console.log(say()); // 2

Burada sayaçOlustur() çalışmasını bitirmiştir; ancak say fonksiyonu değer değişkenini kullandığı için bu değişken erişilebilir kalır. değer doğrudan dışarı açılmadığından kodun başka bir bölümü onu rastgele değiştiremez. Her sayaçOlustur() çağrısı ise kendi bağımsız durumuna sahip yeni bir closure üretir:

Kod:
const birinci = sayaçOlustur();
const ikinci = sayaçOlustur();

birinci(); // 1
birinci(); // 2
ikinci();  // 1

Ne zaman ve nasıl kullanılır?​


Closure kullanırken önce dış kapsamda saklanacak durumu belirleyin, ardından bu durumu okuyup değiştiren işlevleri döndürün.

  1. Dış fonksiyonda durum değişkenini let veya const ile tanımlayın.
  2. Bu değişkene erişmesi gereken iç fonksiyonları yazın.
  3. İç fonksiyonu veya fonksiyonları dışarı döndürün.
  4. Döndürülen fonksiyonları çağırarak durumu yönetin; durum değişkenini doğrudan dışarı açmayın.
  5. Gerekirse aynı dış fonksiyonu yeniden çağırarak birbirinden bağımsız closure örnekleri oluşturun.

Aşağıdaki öğretici örnekte closure, durumun hangi metotlarla değiştirileceğini sınırlar; gerçek bankacılık hesabı veya güvenlik sınırı değildir:

Kod:
function hesapOlustur(baslangic) {
  if (!Number.isFinite(baslangic) || baslangic < 0) {
    throw new TypeError("Başlangıç sonlu ve negatif olmayan sayı olmalıdır");
  }
  let bakiye = baslangic;

  return {
    bakiyeGoster() {
      return bakiye;
    },
    paraEkle(tutar) {
      if (!Number.isFinite(tutar) || tutar <= 0) {
        throw new Error("Tutar pozitif olmalıdır");
      }
      bakiye += tutar;
    }
  };
}

const hesap = hesapOlustur(100);
hesap.paraEkle(50);
console.log(hesap.bakiyeGoster()); // 150

Bu örnekte bakiye nesnenin doğrudan bir özelliği değildir. Dışarıdan hesap.bakiye = 0 yazmak, closure içindeki değişkeni değiştirmez. Değişiklik yalnızca tanımlanan paraEkle işlevinden geçer.

Closure kararını verirken şu ayrım yararlıdır:

İhtiyaçUygun yaklaşımDikkat edilmesi gereken
Tek bir çağrı içinde geçici değerYerel değişkenClosure gerekmeyebilir
Fonksiyon çağrıları arasında gizli durumClosureDurumun ne zaman sıfırlanacağını belirleyin
Birden çok bağımsız örnekClosure üreten fabrika fonksiyonuHer çağrı ayrı durum oluşturur
Paylaşılan ve gözlemlenebilir veriNesne, modül veya sınıfDurumun kim tarafından değiştirilebildiğini açıkça tasarlayın

Sık yapılan hatalar​


En yaygın hata, closure ile kopyalanmış değer kavramını karıştırmaktır. Closure çoğunlukla değişkenin kendisine erişir; değişken sonradan değişirse fonksiyon çağrıldığında güncel değeri görebilir.

Döngülerde özellikle var ile oluşturulan tek bir değişkenin tüm callback'ler tarafından paylaşılması beklenmeyen sonuçlara yol açabilir. Her yinelemede ayrı kapsam oluşturmak için let kullanmak veya döngü gövdesini ayrı bir fonksiyona taşımak daha güvenlidir.

Bir başka hata, büyük nesneleri veya gereksiz verileri uzun süre yaşayan callback'lerde tutmaktır. Closure erişebildiği değerlerin yaşamını uzatabileceği için iş tamamlandığında callback ve ona bağlı referansları saklamamaya dikkat edin. Closure bir güvenlik mekanizması değildir; tarayıcı geliştirici araçlarına veya çalışan kodun diğer yollarına karşı gizlilik garantisi sağlamaz.

Sık sorulan sorular​


Closure ile global değişken arasındaki temel fark nedir?​


Global değişkene programın birçok bölümü erişebilir. Closure ise durumu belirli fonksiyonların kapsamı içinde tutar ve erişimi döndürülen işlevlerle sınırlar.

Her iç içe fonksiyon closure mıdır?​


JavaScript fonksiyonları oluşturulurken çevrelerindeki lexical ortamla bağlantı kurar. Dış değişkeni kullanıp dış çağrı tamamlandıktan sonra saklamak, closure’ın görünür bir kullanım örneğidir; yalnız iç içe fonksiyonlara veya return edilen fonksiyonlara özgü değildir.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic