JavaScript’te değişken konusu “kolay” gibi görünür.
Ama büyük projelerde en çok hata çıkan yerlerden biridir.
Çünkü mesele:
“Değişken tanımlamak” değil,
“Değişkeni doğru yerde yaşatmak.”
Bugün:
var,let,constpsikolojisini- Scope’un gizli kurallarını
- Hoisting tuzaklarını
- Gerçek hayatta nasıl profesyonel kullanıldığını
derinlemesine ama eğlenceli şekilde öğreneceğiz.
1️⃣ Değişken Nedir? (Kutudan Fazlası 📦)
Basit haliyle:
let isim = "Cansu";
Ama JavaScript motorunun beyninde bu şöyle olur:
- Bellekte yer açılır.
- “isim” adında bir referans oluşturulur.
- Değer o referansa bağlanır.
Yani değişken aslında:
Bellekte bir adresin takma adıdır.
Şimdi bunu kanıtlayalım.
let a = 10;
let b = a;
b = 20;
console.log(a); // ?
console.log(b); // ?
Çıktı:
10
20
Neden?
Çünkü primitive (number, string, boolean) değerler kopyalanır.
Ama obje deneyelim:
let user1 = { isim: "Cansu" };
let user2 = user1;
user2.isim = "Ahmet";
console.log(user1.isim); // ?
Çıktı:
Ahmet
İşte burada referans mantığı devreye girer.
Obje kopyalanmaz, referans paylaşılır.
🎯 Profesyonel ipucu:
Objeleri kopyalamak için spread kullan:
let user2 = { ...user1 };
2️⃣ var: Emektar Ama Tehlikeli 🧨
var fonksiyon scope’a sahiptir. Block scope’u yoktur.
Deneyelim:
if (true) {
var mesaj = "Merhaba dünya";
}
console.log(mesaj);
Çalışır.
Şimdi daha karmaşık bir şey yapalım:
for (var i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i);
}, 1000);
}
Ne çıkar?
3
3
3
Neden 0,1,2 değil?
Çünkü:
varblock scope değil- Tek bir
ivar - Loop bittiğinde i = 3
- Timeout çalıştığında hepsi aynı i’yi görür
Şimdi let ile deneyelim:
for (let i = 0; i < 3; i++) {
setTimeout(() => {
console.log(i);
}, 1000);
}
Çıktı:
0
1
2
Neden?
Çünkü her loop iterasyonunda yeni bir block scope oluşur.
🔥 İşte bu fark production’da kritik hataları önler.
3️⃣ let: Modern Düzen Getirici 🧠
let block scope’a sahiptir.
Örnek:
let sayi = 10;
if (true) {
let sayi = 20;
console.log("Blok içi:", sayi);
}
console.log("Global:", sayi);
Çıktı:
Blok içi: 20
Global: 10
Bu ne demek?
Aynı isimli iki farklı değişken var.
İkisi farklı scope’ta yaşıyor.
🎯 İpucu:
Büyük projelerde bu özellik bilinçli kullanılmalı.
Aksi halde “shadowing” kafa karıştırabilir.
4️⃣ const: Sadakat Ama Referans Üzerinden 💍
Basit kullanım:
const pi = 3.14;
Ama olay burada başlıyor:
const user = {
isim: "Cansu"
};
user.isim = "Ahmet";
console.log(user.isim);
Çalışır.
Çünkü:
- const referansı sabitler
- İçeriği değil
Ama şunu yapamazsın:
user = {};
Hata.
🎯 Profesyonel alışkanlık:
- Değişmeyecek her şeyi
constyap. - Bu kodu daha öngörülebilir hale getirir.
- Yanlışlıkla reassign edilmesini engeller.
5️⃣ Scope Türleri (Kodun Coğrafyası 🌍)
🌎 Global Scope
let siteAdi = "KodDunyasi";
function yazdir() {
console.log(siteAdi);
}
yazdir();
Global değişken her yerden erişilebilir.
Ama tehlike:
let sayac = 0;
Bu global ise, her dosya bunu değiştirebilir.
🔥 Büyük projelerde global minimum olmalı.
🏠 Function Scope
function hesapla() {
let sonuc = 10 * 2;
return sonuc;
}
console.log(sonuc); // Hata
Fonksiyon içindeki değişken dışarı çıkamaz.
Bu iyi bir şeydir.
Çünkü kapsülleme sağlar.
🧱 Block Scope
{
let gizli = "Sadece burada";
}
console.log(gizli); // Hata
Bu, özellikle:
- if
- for
- while
- switch
bloklarında önemlidir.
6️⃣ Hoisting: JavaScript’in Sinsi Özelliği 🕵️
var ile:
console.log(a);
var a = 5;
JS bunu şöyle yorumlar:
var a;
console.log(a);
a = 5;
Çıktı:
undefined
let ile:
console.log(b);
let b = 10;
Hata.
Çünkü b, TDZ (Temporal Dead Zone) içindedir.
TDZ = Tanımlanana kadar yasak bölge 🚫
🎯 Bu aslında güvenlik mekanizmasıdır.
7️⃣ Gerçek Hayat Senaryosu: Login Sistemi 🔐
const kullaniciAdi = "Cansu";
let girisSayisi = 0;
function girisYap() {
girisSayisi++;
console.log(`${kullaniciAdi} giriş yaptı.`);
console.log(`Toplam giriş: ${girisSayisi}`);
}
girisYap();
girisYap();
Burada bilinçli tercihler var:
- kullanıcı adı değişmeyecek → const
- giriş sayısı artacak → let
- fonksiyon encapsulation sağlıyor
Temiz mimari.
8️⃣ En Büyük Scope Hataları 🚨
❌ Her şeyi global yapmak
❌ Var kullanarak async hatalar üretmek
❌ Const objeyi immutable sanmak
❌ Shadowing farkında olmamak
9️⃣ Profesyonel Kod Yazma Alışkanlığı
Kural:
- Varsayılan olarak
const - Gerekiyorsa
let - Mecbur kalmadıkça
varasla
Ve her zaman kendine sor:
Bu değişken gerçekten burada mı yaşamalı?
🔥 Sonuç
JavaScript’te ustalık:
- Değişken yazmak değil
- Değişkenin nerede doğduğunu
- Nerede öldüğünü
- Kimlerle etkileştiğini bilmek
Scope yönetimi = Temiz mimari
Const kullanımı = Güvenli kod
Let kontrolü = Esnek yapı
Gerçek yazılımcılar değişken yazmaz.
Onlar değişkenleri yönetir.
