Bu ders için video bulunmamaktadır.
Ders İçeriği
Giriş
JavaScript'te değişkenlerin ve fonksiyonların nerede erişilebilir olduğunu belirleyen kurallara kapsam (scope) denir. Kapsam, kodumuzun daha organize, güvenli ve hatasız olmasını sağlar. Değişkenlerin yanlışlıkla üzerine yazılmasını önler ve kodun farklı bölümlerinin birbirini etkilemesini sınırlar.
Closure ise, JavaScript'in güçlü ve bazen kafa karıştırıcı olabilen bir özelliğidir. Bir fonksiyonun, tanımlandığı kapsamdaki değişkenlere erişebilme yeteneğidir, fonksiyon başka bir kapsamda çalıştırılsa bile. Closure'lar, özel değişkenler oluşturmak, veri gizlemek ve daha gelişmiş programlama desenleri uygulamak için kullanılır.
Bu derste, JavaScript'teki farklı kapsam türlerini (global, fonksiyonel, blok) ve değişkenlerin bu kapsamlarda nasıl davrandığını öğreneceğiz. Ayrıca, closure kavramını, nasıl çalıştığını ve pratik kullanım alanlarını detaylı bir şekilde inceleyeceğiz.
Kapsam (Scope) Nedir?
Kapsam, kodunuzun belirli bir bölümünde hangi değişkenlere ve fonksiyonlara erişilebileceğini belirler. Bir değişken veya fonksiyon tanımladığınızda, o sadece belirli bir kapsam içinde geçerlidir.
JavaScript'te temel olarak üç tür kapsam vardır:
- Global Kapsam (Global Scope): Herhangi bir fonksiyonun veya bloğun dışında tanımlanan değişkenler ve fonksiyonlar global kapsama aittir. Global kapsamdaki öğelere kodun her yerinden erişilebilir.
- Fonksiyon Kapsamı (Function Scope): Bir fonksiyon içinde
var
anahtar kelimesiyle tanımlanan değişkenler, sadece o fonksiyon içinde erişilebilirdir. - Blok Kapsamı (Block Scope):
let
veconst
anahtar kelimeleriyle (ES6 ile geldi) bir blok ({}
süslü parantezler arası, örneğinif
,for
,while
blokları) içinde tanımlanan değişkenler, sadece o blok içinde erişilebilirdir.
Global Kapsam
Herhangi bir fonksiyon veya blok dışında tanımlanan değişkenler global kapsama aittir. Bu değişkenlere kodun herhangi bir yerinden erişilebilir.
Uyarı: Global değişkenleri aşırı kullanmaktan kaçının. Kodun farklı bölümlerinden erişilebilir olmaları, beklenmedik değişikliklere ve hatalara yol açabilir. Mümkün olduğunca değişkenleri yerel kapsamlarda (fonksiyon veya blok) tanımlamaya çalışın.
Tarayıcı ortamında, global kapsam genellikle window
nesnesine karşılık gelir. Yani, global olarak tanımlanan bir değişken, window
nesnesinin bir özelliği olur.
Fonksiyon Kapsamı
Bir fonksiyon içinde var
anahtar kelimesiyle tanımlanan değişkenler, fonksiyon kapsamına sahiptir. Bu değişkenlere sadece tanımlandıkları fonksiyon içinden erişilebilir.
Fonksiyonlar içinde tanımlanan fonksiyonlar da (iç içe fonksiyonlar) dıştaki fonksiyonun kapsamındaki değişkenlere erişebilir.
Blok Kapsamı
ES6 ile gelen let
ve const
anahtar kelimeleri, blok kapsamı kavramını JavaScript'e getirmiştir. Bir blok ({}
süslü parantezler arası) içinde let
veya const
ile tanımlanan değişkenler, sadece o blok içinde geçerlidir.
İpucu: Modern JavaScript'te, değişken tanımlamak için genellikle var
yerine let
ve const
kullanılması önerilir. Blok kapsamı, değişkenlerin etki alanını daha iyi kontrol etmenizi sağlar ve beklenmedik hataları önlemeye yardımcı olur.
Kapsam Zinciri (Scope Chain)
JavaScript motoru bir değişkene erişmeye çalıştığında, önce mevcut kapsamda (örneğin, içinde bulunduğu fonksiyon veya blok) arar. Eğer değişken orada bulunamazsa, bir üst kapsama (örneğin, dıştaki fonksiyon veya global kapsam) bakar. Bu arama işlemi, değişken bulunana veya global kapsama ulaşılana kadar devam eder. Bu kapsamlardan oluşan hiyerarşiye kapsam zinciri denir.
Closure Nedir?
Closure, bir fonksiyonun, tanımlandığı andaki kapsam zincirine (lexical scope) erişebilme yeteneğidir. Başka bir deyişle, bir fonksiyon, kendi kapsamı dışındaki (örneğin, onu içeren dış fonksiyonun kapsamındaki) değişkenlere erişebilir ve bu değişkenleri "hatırlayabilir", fonksiyon başka bir yerde çağrılsa bile.
Closure'lar, bir fonksiyonun başka bir fonksiyon tarafından döndürülmesiyle oluşur. İçteki fonksiyon, dıştaki fonksiyonun değişkenlerine erişimi korur.
Yukarıdaki örnekte, disFonksiyon
çalışıp bittikten sonra bile, closureOlustur
değişkenine atanan icFonksiyon
, disFonksiyon
'un kapsamındaki mesaj
değişkenine erişmeye devam eder. İşte bu duruma closure denir.
Closure Kullanım Alanları
Closure'lar, JavaScript'te birçok güçlü desenin temelini oluşturur:
1. Veri Gizleme ve Özel Değişkenler (Data Encapsulation)
Closure kullanarak, bir fonksiyonun içindeki değişkenleri dışarıdan erişilemez hale getirebilir (özel değişkenler) ve bu değişkenlere sadece belirli metodlar aracılığıyla erişilmesini sağlayabilirsiniz.
2. Fonksiyon Fabrikaları (Function Factories)
Closure kullanarak, belirli parametrelerle yapılandırılmış yeni fonksiyonlar üreten fonksiyonlar (fonksiyon fabrikaları) oluşturabilirsiniz.
3. Callback Fonksiyonları ve Asenkron İşlemler
Closure'lar, callback fonksiyonlarında ve asenkron işlemlerde (örneğin, setTimeout
, olay dinleyicileri) sıklıkla kullanılır. Callback fonksiyonunun, çağrıldığı andaki değil, tanımlandığı andaki değişkenlere erişmesi gerektiğinde closure devreye girer.
Uyarı: Döngüler içinde var
ile closure kullanırken dikkatli olunmalıdır. var
fonksiyon kapsamlı olduğu için, döngü bittikten sonra çalışan callback fonksiyonları genellikle döngü değişkeninin son değerini görür. Bu sorunu çözmek için let
(blok kapsamlı) veya IIFE gibi teknikler kullanılabilir.
Alıştırmalar
- Global, fonksiyon ve blok kapsamlarını gösteren basit bir kod örneği yazın. Farklı kapsamlardaki değişkenlere erişmeye çalışın ve sonuçları yorumlayın.
- Bir "kullanıcı profili" oluşturan bir fonksiyon fabrikası yazın. Bu fabrika, kullanıcının adını ve yaşını parametre olarak almalı ve kullanıcının bilgilerini döndüren (
getBilgi
) ve yaşını artıran (yasArtir
) metodlara sahip bir nesne döndürmelidir. Closure kullanarak ad ve yaş bilgilerini özel tutun. - Bir dizi içindeki her eleman için 1 saniye arayla konsola mesaj yazdıran bir fonksiyon yazın.
setTimeout
ve closure kullanarak her elemanın doğru değerini yazdığından emin olun. - Closure kullanarak sadece bir kez çalıştırılabilen bir fonksiyon oluşturan bir fonksiyon yazın. (İpucu: Fonksiyonun içinde bir bayrak değişkeni tutun).
Bu derste JavaScript'teki kapsam ve closure kavramlarını öğrendik:
- Kapsam (Scope): Değişkenlerin ve fonksiyonların erişilebilirliğini belirler (Global, Fonksiyon, Blok).
- Global Kapsam: Kodun her yerinden erişilebilir.
- Fonksiyon Kapsamı:
var
ile tanımlanan değişkenler için geçerlidir, sadece fonksiyon içinden erişilebilir. - Blok Kapsamı:
let
veconst
ile tanımlanan değişkenler için geçerlidir, sadece tanımlandıkları blok içinden erişilebilir. - Kapsam Zinciri: Değişken arama mekanizmasıdır, mevcut kapsamdan başlayarak global kapsama kadar devam eder.
- Closure: Bir fonksiyonun, tanımlandığı kapsamdaki değişkenlere erişebilme ve onları "hatırlayabilme" yeteneğidir.
- Closure Kullanım Alanları: Veri gizleme, fonksiyon fabrikaları, callback'ler ve asenkron işlemler gibi birçok desende kullanılır.
Kapsam ve closure, JavaScript'in temel ve güçlü kavramlarıdır. Bu kavramları iyi anlamak, daha modüler, güvenli ve etkili kod yazmanıza yardımcı olacaktır.
Bir sonraki bölümde, JavaScript'in önemli veri yapılarından olan diziler ve nesneleri daha detaylı inceleyeceğiz.