Değişken Tanımlama: var, let ve const Arasındaki Farklar Nelerdir?

crazy_coder

Moderatör
Katılım
20 Şub 2026
Mesajlar
204
Tepkime puanı
0
Puanları
16
JavaScript öğrenmeye başlayan herkesin karşısına çıkan ilk yol ayrımı şudur: "Bir değişkeni tanımlarken hangi anahtar kelimeyi kullanmalıyım?" Eskiden sadece var vardı ve hayat nispeten daha basitti (veya biz öyle sanıyorduk). Ancak 2015 yılında gelen ES6 (ECMAScript 2015) güncellemesi ile hayatımıza let ve const girdi.

Peki, neden üç farklı yöntem var? Modern JavaScript projelerinde neden artık neredeyse hiç var görmüyoruz? Bu rehberde, bu üçlü arasındaki kritik farkları, kapsam (scope) mantığını ve neyi nerede kullanmanız gerektiğini inceleyeceğiz.

1. Kapsam (Scope) Mantığı: Function Scope vs Block Scope​


Bu üç anahtar kelime arasındaki en temel fark, değişkenin "nerede yaşadığı" ile ilgilidir.


  • []var (Function Scope): Bir fonksiyonun içinde tanımlandığında sadece o fonksiyonun içinden erişilebilir. Ancak bir if bloğu veya for döngüsü içinde tanımlanırsa, o bloğun dışından da erişilebilir. Bu durum çoğu zaman beklenmedik hatalara yol açar.
    []let ve const (Block Scope): Sadece tanımlandıkları süslü parantezler { } (if, for, while, function vb.) içinde geçerlidirler. Bloğun dışına çıktığınızda o değişken artık yoktur.

2. Yeniden Tanımlama ve Güncelleme​


Kod yazarken bir değişkeni yanlışlıkla tekrar tanımlamak büyük bir felakete yol açabilir.


  • []var: Aynı isimle tekrar tekrar tanımlanabilir. JavaScript motoru buna kızmaz, en son tanımı kabul eder.
    []let: Aynı kapsam (scope) içerisinde aynı isimle tekrar tanımlanamaz. Ancak değeri güncellenebilir.
  • const: Adı üzerinde (Constant - Sabit); ne tekrar tanımlanabilir ne de değeri sonradan değiştirilebilir.

3. Hoisting (Yukarı Çekme) Davranışı​


JavaScript, kodları çalıştırmadan önce değişken tanımlamalarını en tepeye taşır. Ancak bu durum üçü için farklı sonuçlar doğurur:


  • []var: Tanımlanmadan önce çağrılırsa hata vermez, undefined döner.
    []let ve const: Tanımlanmadan önce çağrılırsa "Temporal Dead Zone" (Geçici Ölü Bölge) nedeniyle hata fırlatır. Kodunuzun daha güvenli olmasını sağlar.

Kod Örnekleri ile Karşılaştırma​


Aşağıdaki kod blokları, bu farkların pratikte nasıl çalıştığını net bir şekilde anlamanızı sağlayacaktır:

JavaScript:
// --- VAR ÖRNEĞİ ---
if (true) {
var forumName = "XenForo Türkiye";
}
console.log(forumName); // Çıktı: "XenForo Türkiye" (Çünkü block scope değil!)

// --- LET ÖRNEĞİ ---
if (true) {
let username = "Gemini";
console.log(username); // Çıktı: "Gemini"
}
// console.log(username); // HATA! username is not defined.

// --- CONST ÖRNEĞİ ---
const pi = 3.14;
// pi = 3; // HATA! Sabit bir değere tekrar atama yapılamaz.

// --- CONST VE OBJELER ---
// Dikkat: const ile tanımlanan bir objenin içindeki özellikleri değiştirebilirsiniz!
const user = { id: 1, name: "Ahmet" };
user.name = "Mehmet"; // Bu mümkündür.
// user = { id: 2 }; // Bu HATA verir!

Özet Karşılaştırma Tablosu​


Hangi durumda hangisini kullanacağınızı hızlıca seçmek için bu tabloya göz atabilirsiniz:

Özellikvarletconst
Kapsam (Scope)Function ScopeBlock ScopeBlock Scope
Yeniden Atama (Re-assign)EvetEvetHayır
Yeniden TanımlamaEvetHayırHayır
HoistingUndefined dönerHata verirHata verir

Hangi Durumda Hangisini Kullanmalıyım?​


Modern JavaScript (Clean Code) standartlarına göre altın kural şudur:


  1. []Varsayılan olarak const kullanın. Değerin değişmeyeceğinden eminseniz kodunuzun okunabilirliğini ve güvenliğini artırır.
    []Eğer bir değişkenin değerini daha sonra değiştirecekseniz (örneğin bir döngü sayacı veya bir matematiksel işlem sonucu) let kullanın.
  2. var kullanımından kaçının. Modern projelerde var kullanmak, hata yapma riskini artıran eski bir alışkanlıktır.

Küçük Bir İpucu: const kullanmak sadece bir kısıtlama değil, aynı zamanda kodunuzu okuyan diğer geliştiricilere (veya 6 ay sonraki kendinize) "Bu değerin asla değişmemesi gerekiyor, ona göre güvenebilirsin" mesajını verir.



Sonuç

JavaScript'in evrimi, dili daha katı ama daha güvenli bir hale getirdi. let ve const kullanarak, global kapsamı kirletmeden ve karmaşık hatalarla uğraşmadan çok daha temiz kodlar yazabilirsiniz.
 
Geri
Üst