JavaScript Değişkenleri: Kod Blokları, Scope Savaşları ve Gerçek Hayat Senaryoları 🎭

JavaScript Rehberi

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, const psikolojisini
  • 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:

  1. Bellekte yer açılır.
  2. “isim” adında bir referans oluşturulur.
  3. 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ü:

  • var block scope değil
  • Tek bir i var
  • 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 const yap.
  • 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:

  1. Varsayılan olarak const
  2. Gerekiyorsa let
  3. Mecbur kalmadıkça var asla

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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir