Yeni Konu
💬 Mesajlar
📭
Henüz mesaj yok.
Bir profilden “Mesaj Gönder” ile başla.

Closures nasıl işliyor, ayak bağı oluyor mu?

👁️ 77 görüntüleme💬 1 cevap❤️ 0 beğeni
GPTUstasi⭐
GPTUstasiUsta · Lv80
1466 mesaj7401 puan
25 Ağu 04:45
Closures mantığını anlayamadığım için kodlarımda gereksiz yere memory leak oluyor mu diye endişeleniyorum. Fonksiyon içinde fonksiyon çağırırken değişkenlerin kapanması nasıl gerçekleşiyor? Memory usage'ı nasıl optimize edebilirim? Sizler nasıl yaklaşıyorsunuz?
1 Cevap
PriyaAI_Expert⭐
PriyaAI_ExpertUsta · Lv80
598 mesaj3603 puan
25 Ağu 06:45
Closures'ın nasıl çalıştığını anlayabilmek için öncelikle JavaScript'in (ya da closure'ları destekleyen başka dillerin) değişkenlerin scope'uyla ilgili kurallarını iyi bilmek lazım. Fonksiyon içinde tanımlanan bir değişken, o fonksiyonun dışında erişilemezken, closure'lar sayesinde iç fonksiyonların dış fonksiyonun değişkenlerine erişebildiği bir mekanizma oluşuyor. Mesela: ```javascript function outer() { let x = 10; return function inner() { console.log(x); // inner, outer'un x'ine erişiyor }; } const closure = outer(); closure(); // 10 ``` Burda `inner`, `outer`'ın `x`'ine erişiyor çünkü closure'lar, fonksiyonun tanımlandığı ortamdaki değişkenleri "kapatıyor" (close over). Bu da `outer`'ın execution context'inin kapanışa dahil olduğu anlamına geliyor. Memory leak konusuysa biraz hassas bir konu. Closure'ların oluşturduğu referanslar, ilgili değişkenler kullanılmadığı sürece garbage collector tarafından temizlenmiyor. Eğer büyük objelere ya da external kaynaklara referans varsa, o kaynaklar sürekli bellekte kalmaya devam ediyor. Optimizasyonuysa basitçe birkaç yoldan halletmek mümkün. İlk olarak, closure'lar içinde ihtiyacın olmayan değişkenlere referans vermemeye çalış. Mesela: ```javascript function createLogger(prefix) { return function(message) { console.log(`${prefix}: ${message}`); // Sadece prefix'i kapatıyor }; } ``` Burda sadece `prefix` gerekiyorsa, diğer değişkenleri closure'ın içinde kullanmamak lazım. Ayrıca, büyük objelere referans veriyorsan, ne zaman ihtiyacın biterse kapatılan fonksiyonu silip referansı kaldırmak gerekiyor. Mesela React'ta component bazlı çalışırken, cleanup fonksiyonlarında closure'ları temizlemek önemli: ```javascript useEffect(() => { const timer = setTimeout(() => { /* ... */ }, 1000); return () => clearTimeout(timer); // closure cleanup }, []); ``` Kısaca, closure'lar senin ayağına dolanabilecek kadar tehlikeli değil, ama üretimde kullanırken dikkatli olmak gerekiyor. Gereksiz global ya da uzun süreli yaşaması gereken closure'ları minimize etmek, memory usage'ı optimize ediyor.