Neler yeni

Yazılım Forum

Tüm özelliklerimize erişmek için şimdi bize katılın. Kayıt olduktan ve giriş yaptıktan sonra konu oluşturabilecek, mevcut konulara yanıt gönderebilecek, itibar kazanabilecek, özel mesajlaşmaya erişebilecek ve çok daha fazlasını yapabileceksiniz! Bu hizmetlerimiz ise tamamen ücretsiz ve kurallara uyulduğu sürece sınırsızdır, o zaman ne bekliyorsunuz? Hadi, sizde aramıza katılın!

Closures: Kapsamın Gücü ve JavaScript'teki Derinlemesine Kullanımı

Closures, yani kapanışlar, modern programlama dillerinin temel ve güçlü konseptlerinden biridir. Özellikle JavaScript gibi dillerde sıkça karşımıza çıkar ve fonksiyonların kendi oluşturulduğu kapsamı (lexical environment) hatırlamasını sağlar. Bu özellik, bir iç fonksiyonun, dış fonksiyonu çalışması sona erdikten sonra bile, dış fonksiyonun değişkenlerine ve argümanlarına erişebilmesine olanak tanır.

Kapsamın Gücü terimi, closure'ların bu benzersiz yeteneğini vurgular. Bir fonksiyon, tanımlandığı anda çevresindeki kapsamı da kapsar. Bu kapsam, fonksiyonun içindeki yerel değişkenleri, dış fonksiyonun değişkenlerini ve global değişkenleri içerir. Bir iç fonksiyon, dış fonksiyonundan döndürüldüğünde bile, bu "hafızayı" beraberinde taşır. İşte bu "hafıza", closure'ın ta kendisidir. Bu mekanizma, fonksiyonların daha esnek ve güçlü bir şekilde davranmasına olanak tanırken, aynı zamanda veri soyutlama ve gizliliği gibi önemli programlama prensiplerini de destekler.

Basit bir örnekle closure'ların nasıl çalıştığını daha iyi anlayabiliriz:
Kod:
function disFonksiyon(disDegisken) {
    return function icFonksiyon(icDegisken) {
        console.log("Dış değişken: " + disDegisken);
        console.log("İç değişken: " + icDegisken);
    };
}

const closureOrnegi = disFonksiyon("Merhaba");
closureOrnegi("Dünya"); // Çıktı: "Dış değişken: Merhaba", "İç değişken: Dünya"
Yukarıdaki örnekte, `icFonksiyon` bir closure'dır. `disFonksiyon` çağrıldıktan ve yürütülmesi tamamlandıktan sonra bile, `disDegisken`'in değerini ("Merhaba") hatırlar ve erişebilir. Bu, `icFonksiyon`'un oluşturulduğu lexikal ortamı (yani `disFonksiyon`'un kapsamını) "kapatması" sayesinde gerçekleşir.

Closures'ın pratik ve yaygın kullanım alanlarından biri de özel (private) değişkenlere sahip fonksiyonel sayıcılar oluşturmaktır:
Kod:
function sayacOlustur() {
    let sayi = 0; // Bu değişken sayacOlustur'un kapsamında kalır ve dışarıdan doğrudan erişilemez.

    return {
        arttir: function() {
            sayi++;
            return sayi;
        },
        azalt: function() {
            sayi--;
            return sayi;
        },
        degeriAl: function() {
            return sayi;
        }
    };
}

const benimSayacim = sayacOlustur();
console.log(benimSayacim.arttir()); // Çıktı: 1
console.log(benimSayacim.arttir()); // Çıktı: 2
console.log(benimSayacim.azalt());  // Çıktı: 1
console.log(benimSayacim.degeriAl()); // Çıktı: 1

const baskaSayac = sayacOlustur();
console.log(baskaSayac.arttir()); // Çıktı: 1 (Kendi bağımsız "sayi" değişkenine sahip)
Bu örnekte, `sayi` değişkeni dışarıdan doğrudan erişilemez; sadece döndürülen `arttir`, `azalt` ve `degeriAl` metotları aracılığıyla manipüle edilebilir. Bu, güçlü bir veri gizliliği (encapsulation) sağlar ve programın daha modüler ve hataya dayanıklı olmasına yardımcı olur.

Closures'ın sunduğu başlıca avantajlar ve kullanım alanları şunlardır:
  • Veri Gizliliği (Encapsulation): Değişkenlerin dış dünyadan izole edilmesini sağlayarak, sadece belirlenen arayüzler (döndürülen fonksiyonlar) üzerinden erişim ve manipülasyon imkanı sunar. Bu, özellikle modül desenleri oluştururken kritik bir özelliktir.
  • Fonksiyonel Programlama: Yüksek mertebeden fonksiyonlar ve durum yönetimi için güçlü bir araçtır. Fonksiyonları bir değer gibi ele almayı kolaylaştırır ve `currying` gibi tekniklerin uygulanmasına olanak tanır.
  • Modül Tasarımı: JavaScript'teki modül desenlerinin (Module Pattern ve IIFE - Immediately Invoked Function Expression kullanarak) temelini oluşturur. Ortak bir kapsamda özel değişkenler ve metotlar tanımlanmasına olanak tanır, böylece global kapsamın kirlenmesini önler.
  • Durum Yönetimi: Uygulamalarda belirli bir durumu (state) korumak ve yönetmek için kullanılabilir, örneğin bir kullanıcı arayüzü bileşeninin kendi iç durumunu saklaması veya bir API çağrısının yüklenme durumunu takip etmesi gibi.
  • Geri Çağırım Fonksiyonları (Callbacks): Asenkron işlemlerde, callback fonksiyonlarının dış kapsamdaki değişkenlere erişmesini sağlar. Örneğin, bir `setTimeout` veya bir olay dinleyicisi içindeki fonksiyonun, dışarıdaki bir değişkeni güncellemesi gerekebilir.
  • Memorizasyon (Memoization): Daha önce hesaplanmış sonuçları önbelleğe almak için kullanılabilir, böylece aynı hesaplama tekrarlandığında performansı artırır.

Her ne kadar güçlü olsalar da, closure'ların bazı dikkat edilmesi gereken yönleri vardır:
  • Bellek Yönetimi: Bir closure, referansını tuttuğu dış kapsamdaki değişkenleri bellekte tutmaya devam eder. Eğer closure'lar gereksiz yere uzun süre bellekte kalırsa veya çok sayıda closure oluşturulursa, bellek sızıntılarına veya gereksiz bellek tüketimine yol açabilir. Bu nedenle, artık ihtiyaç duyulmayan closure'ların referanslarının serbest bırakılması (örneğin, olay dinleyicilerini kaldırmak) önemlidir.
  • Karmaşıklık: Özellikle iç içe geçmiş veya karmaşık closure yapıları, kodu anlamayı ve hata ayıklamayı zorlaştırabilir. İyi yazılmış, modüler ve belgelenmiş kod pratikleri bu noktada önem kazanır. Hata ayıklama araçları, bir fonksiyonun hangi kapanış ortamına sahip olduğunu anlamak için yardımcı olabilir.

Closures, modern web geliştirmenin birçok alanında yaygın olarak kullanılır. Örneğin:
  • Olay Dinleyicileri (Event Listeners): DOM elementlerine olay dinleyicileri eklerken, dinleyici fonksiyonunun dış kapsamdaki verilere (örneğin, bir sayaç veya bir kullanıcının ID'si) erişmesi gerekebilir. Closure'lar, bu verileri olay işleyicisi için kullanılabilir kılar.
  • Zamanlayıcılar (Timers): `setTimeout` veya `setInterval` gibi fonksiyonlarla birlikte kullanıldığında, callback fonksiyonunun belirli bir zamanda dış kapsamdaki değişkenlere erişmesini sağlar. Bu, asenkron akış kontrolünde temel bir yapıdır.
  • Kütüphane ve Çerçeveler (Libraries and Frameworks): React gibi modern kütüphanelerde `useState` ve `useEffect` hook'larının altında yatan mekanizmalardan biri olarak closure'lar kullanılır. Bu, her bir bileşen örneğinin kendi bağımsız durumuna sahip olmasını sağlar.
  • Fonksiyon Kompozisyonu ve Currying: Küçük, yeniden kullanılabilir fonksiyonları bir araya getirerek daha karmaşık davranışlar oluşturmada closure'lardan faydalanılır. Currying, bir fonksiyonun birden çok argümanını tek tek alarak her çağrıda yeni bir fonksiyon döndürmesini sağlayan bir tekniktir ve closure'lar aracılığıyla uygulanır.

Programlama dünyasında kapanışlar üzerine sıklıkla atıfta bulunulan bir tanım vardır:
"Closures are functions that refer to independent (free) variables. In other words, the function defined in the closure 'remembers' the environment in which it was created."[newline]
Bu tanım, closure'ın temel prensibini ve neden bu kadar güçlü olduğunu çok güzel özetler.

Closures hakkında daha detaylı bilgi ve örnekler için Mozilla Developer Network (MDN) web sitesini ziyaret edebilirsiniz: MDN Web Docs: Closures

Özetle, closure'lar, fonksiyonların oluşturuldukları kapsamı hatırlamasını sağlayan, JavaScript ve benzeri dillerde güçlü ve esnek bir programlama aracıdır. Doğru anlaşıldığında ve kullanıldığında, daha temiz, daha sürdürülebilir ve daha güvenli kod yazılmasına olanak tanır. Kapsamın bu benzersiz gücü, modern yazılım mimarilerinin temel taşlarından birini oluşturur ve geliştiricilere karmaşık problemleri zarif bir şekilde çözmek için güçlü bir mekanizma sunar. Programlama yeteneklerinizi bir üst seviyeye taşımak için closure'ları derinlemesine öğrenmek kaçınılmazdır.
 
shape1
shape2
shape3
shape4
shape5
shape6
Üst

Bu web sitenin performansı Hazal Host tarafından sağlanmaktadır.

YazilimForum.com.tr internet sitesi, 5651 sayılı Kanun’un 2. maddesinin 1. fıkrasının (m) bendi ve aynı Kanun’un 5. maddesi kapsamında Yer Sağlayıcı konumundadır. Sitede yer alan içerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır.

YazilimForum.com.tr, kullanıcılar tarafından paylaşılan içeriklerin doğruluğunu, güncelliğini veya hukuka uygunluğunu garanti etmez ve içeriklerin kontrolü veya araştırılması ile yükümlü değildir. Kullanıcılar, paylaştıkları içeriklerden tamamen kendileri sorumludur.

Hukuka aykırı içerikleri fark ettiğinizde lütfen bize bildirin: lydexcoding@gmail.com

Sitemiz, kullanıcıların paylaştığı içerik ve bilgileri 6698 sayılı KVKK kapsamında işlemektedir. Kullanıcılar, kişisel verileriyle ilgili haklarını KVKK Politikası sayfasından inceleyebilir.

Sitede yer alan reklamlar veya üçüncü taraf bağlantılar için YazilimForum.com.tr herhangi bir sorumluluk kabul etmez.

Sitemizi kullanarak Forum Kuralları’nı kabul etmiş sayılırsınız.

DMCA.com Protection Status Copyrighted.com Registered & Protected