Değişkenler & Operatörler

Değişkenler & Operatörler: JavaScript'teki `var`, `let` ve `const`, üç farklı depolama kabı gibidir: `var` altı delik bir kova — içine koyduğun değer fonksiyon sınırı dışına sıza

JavaScript'teki `var`, `let` ve `const`, üç farklı depolama kabı gibidir: `var` altı delik bir kova — içine koyduğun değer fonksiyon sınırı dışına sızabilir (hoisting + function scope). `let` kapağı olan bir kutu — değeri değiştirebilirsin ama sadece tanımlandığı blok içinde erişilebilir. `const` ise mühürlenmiş bir kutu — bir kez doldurursun, referansını asla değiştiremezsin. Peki neden üç ayrı keyword var? `var`'ın fonksiyon scope'u, döngülerde beklenmedik davranışlara yol açıyordu: bir `for` döngüsü içindeki `var i` döngü dışında da erişilebilir kalıyordu — bu Java'da asla olmaz çünkü Java'daki tüm değişkenler blok kapsamlıdır. ES6 ile `let` ve `const` bu problemi çözdü. Java'da `final` ile `const`'ı karşılaştırırsan: her ikisi de yeniden atamayı yasaklar, ama `const` bir nesneye referans tutuyorsa nesnenin içeriği değiştirilebilir — Java'da `final List list` listene eleman ekleyebilirsin, aynı şekilde. QA perspektifinden: `const` ile tanımlanan locator değişkeni test boyunca sabit kalır, accidental reassignment'tan korur.

var, let, const Farkları

🎬 var'ın Sızıntısı: Bir Değişken Bloktan Nasıl Kaçar?

ReferenceError (TDZ)

`if (true) { var score = 95; }` — score, if bloğunun İÇİNDE tanımlanır. Java'da bu blok bittiğinde değişken yok olur. JavaScript'te `var` için durum FARKLIDIR.

`console.log(score)` blok dışında çağrılır — ve `95` YAZDIRILIR! `var`'ın function-scope doğası, değeri bloğun sınırlarını aşarak dışarı sızdırır.

Kontrast — AYNI kodu `let score = 95;` ile yazarsan `let` bloğa MÜHÜRLENİR. Blok dışında `console.log(score)` artık sızıntı değil, doğrudan bir HATA verir.

`let` ve `const` tanımlanmadan önce erişilirse Temporal Dead Zone (TDZ) devreye girer ve `ReferenceError` fırlatılır — Java'daki derleme zamanı hatasının, JS'teki çalışma zamanı karşılığı.

Final — bu yüzden modern JavaScript'te `const` varsayılan tercih, `let` sadece yeniden atama gerektiğinde kullanılır; `var` neredeyse hiç kullanılmaz. Kapsam sızıntısı böyle önlenir.

Bu kod `var` kullanılan değişkeni değerinden ÖNCE okuyor. Ne olur?

ReferenceError: testCount is not defined

`var` ile tanımlanan değişkenler HOISTING nedeniyle dosyanın en tepesine "çekilir" — tanım zaten bilinir, sadece değer henüz atanmamıştır.

42, sonra 42 (hoisting değeri de taşır)

Hoisting sadece TANIMI yukarı taşır, DEĞERİ değil — atama satırına gelene kadar değer `undefined`'dır.