𝗝𝗮𝘃𝗮𝗦𝗰𝗿𝗶𝗽𝘁 𝗖𝗹𝗼𝘀𝘂𝗿𝗲𝘀 𝗔ç̧𝗸𝗹𝗮𝗻ı𝗹ı𝘆𝗼𝗿
JavaScript'te her gün closures (kapanışlar) kullanırsınız. Muhtemelen bunları React hook'larında, olay dinleyicilerinde (event listeners) ve Node.js callback'lerinde kullanıyorsunuzdur. Birçok geliştirici teoride zorlansa da, kalıbı bir kez gördüğünüzde kavram oldukça basittir.
Closures kavramını anlamak için lexical scope (sözcüksel kapsam) kavramını anlamalısınız.
Lexical scope, bir fonksiyonun kendi kapsamındaki ve tanımlandığı herhangi bir dış kapsamdaki değişkenlere erişebilmesi anlamına gelir. Bu, kodun nerede çağrıldığına değil, nerede yazıldığına bağlıdır.
Closure, orijinal kapsamı çalışmasını tamamladıktan sonra bile o kapsamdaki değişkenleri hatırlayan bir fonksiyondur.
Bir fonksiyonu sırt çantası taşıyan birine benzetin. Fonksiyon oluşturulduğunda, çevresinden ihtiyaç duyduğu her değişkeni bu sırt çantasına paketler. Fonksiyon, gittiği her yere o sırt çantasını da götürür.
İşte closure'ların pratikte nasıl çalıştığı:
Özel Değişkenler (Private Variables): Verileri dış dünyadan gizleyebilirsiniz. Bir banka hesabı örneğinde, bakiye (balance) değişkeni özel kalır. Onu yalnızca para yatırma (deposit) veya para çekme (withdraw) gibi belirli yöntemlerle değiştirebilirsiniz. Bu, hassas verilere doğrudan erişimi engeller.
Fonksiyon Fabrikaları (Function Factories): Başka fonksiyonlar üreten fonksiyonlar oluşturabilirsiniz. Bir çarpıcı (multiplier) fabrikası, bir ikiyle çarpma (double) veya üçle çarpma (triple) fonksiyonu oluşturabilir. Her yeni fonksiyon, kendi özel çarpanını sırt çantasında saklar.
Olay Dinleyicileri (Event Listeners): Bir düğmeye tıklama olayı (click event) eklediğinizde, işleyici (handler) kurulum fonksiyonundan (setup function) gelen verileri hatırlar. Kurulum fonksiyonu bittikten sonra bile dinleyici bu verileri tutmaya devam eder.
React Hook'ları: Her
useStateveyauseEffectkullandığınızda, closure'ları kullanmış olursunuz. React'te yaygın bir hata, bir closure'ın state'in eski bir değerini yakalamasıyla (capture) meydana gelir. Buna "stale closure" (bayat closure) denir.
Bellek kullanımına dikkat edin. Bir closure, değişkenlere canlı bir referans tuttuğu için, closure var olduğu sürece motor (engine) bunları çöp toplama (garbage collection) yoluyla temizleyemez. Uzun süre ihtiyacınız olmayacaksa, closure içinde devasa nesneler tutmaktan kaçının.
Özet:
- Lexical scope erişimi tanımlar.
- Closures bu erişimi kalıcı hale getirir.
- Bir fonksiyon, çevresini bir sırt çantasında taşır.
- Kapsam hatalarından (scoping bugs) kaçınmak için döngülerde
varyerineletkullanın.
Kaynak: https://dev.to/digitalunicon/javascript-closures-explained-with-examples-339f