Anasayfa / JAVASCRIPT / JavaScript Değişkenler: var, let ve const Kullanımı ve Farkları

JavaScript Değişkenler: var, let ve const Kullanımı ve Farkları

Programlamaya başlarken öğrenilen ilk ve en temel kavramlardan biri değişkenlerdir (variables). JavaScript dilinde de değişkenler, web uygulamalarımızı statik bir yapıdan çıkarıp her çalıştığında farklı verilere tepki verebilen dinamik programlara dönüştüren en önemli yapı taşlarıdır. Bir değişkeni, içine farklı türde veriler koyabileceğiniz, daha sonra bu verileri okuyabileceğiniz veya değiştirebileceğiniz bir “kutu” veya “etiket” olarak düşünebilirsiniz.

Geçmişte JavaScript, değişken tanımlamak için sadece tek bir kelimeye (keyword) sahipti: var. Ancak uygulamalar büyüdükçe ve karmaşıklaştıkça var kullanımından kaynaklanan hatalar geliştiricilerin başını ağrıtmaya başladı. Bu nedenle 2015 yılında yayınlanan ECMAScript 6 (ES6) standartları ile birlikte JavaScript’e blok kapsamına (block scope) sahip olan let ve const kelimeleri eklendi,. Herhangi bir anahtar kelime kullanmadan değişken tanımlarsanız bu doğrudan global kapsama dahil olur, ancak bu istenmeyen bir durumdur ve kaçınılması gerekir.

Modern web geliştirme süreçlerinde ve SEO uyumlu temiz kod yazımında bu üçlü arasındaki farkları bilmek hayati önem taşır. Bu kapsamlı rehberde, ilk defa değişken mantığını öğrenecekler için var, let ve const kavramlarını, aralarındaki farkları ve hangi durumlarda hangisini kullanmanız gerektiğini detaylı örneklerle inceleyeceğiz.

1. Kapsam (Scope) Nedir ve Neden Önemlidir?

Değişkenlerin farklarını tam olarak anlayabilmek için öncelikle “Kapsam” (Scope) terimini bilmek gerekir. Kapsam, bir değişkenin kodun hangi bölümlerinden erişilebilir olduğunu belirler. Temel olarak JavaScript’te üç farklı kapsamdan bahsedebiliriz:

  • Global Kapsam (Global Scope): Herhangi bir fonksiyonun veya bloğun dışında, kodun en üst seviyesinde tanımlanan değişkenlerdir. Global değişkenlere kodun her yerinden erişilebilir.
  • Fonksiyon Kapsamı (Function Scope): Sadece tanımlandığı fonksiyonun içerisinden erişilebilen değişkenlerdir.
  • Blok Kapsamı (Block Scope): Sadece süslü parantezler { } (örneğin bir if koşulu veya for döngüsü) içerisinde geçerli olan değişkenlerdir.

İşte var, let ve const arasındaki en büyük savaş bu kapsam kurallarından kaynaklanmaktadır.

2. Geleneksel Yöntem: var Kullanımı

JavaScript’in doğuşundan 2015 yılına kadar değişken tanımlamak için sadece var kelimesi kullanılıyordu,. Ancak var kelimesi, modern programlama ihtiyaçlarına tam olarak uyum sağlayamayan bazı teknik “kusurlara” sahiptir.

Fonksiyon Kapsamına Sahiptir: var ile tanımlanan bir değişken blok kapsamını tanımaz, yalnızca fonksiyon kapsamını veya global kapsamı dikkate alır,. Süslü parantezler { } var için bir sınır ifade etmez.

function calis() {
    if (true) {
        var mesaj = "Merhaba Dünya";
    }
    console.log(mesaj); // Çıktı: Merhaba Dünya
}
calis();

Yukarıdaki örnekte mesaj değişkeni if bloğu (süslü parantezler) içerisinde tanımlanmış olmasına rağmen, var ile tanımlandığı için dışarı sızar ve bloğun dışında da erişilebilir hale gelir. Bu durum, büyük kod bloklarında aynı isimli değişkenlerin birbirini ezmesine ve ciddi güvenlik veya mantık hatalarına (bug) yol açmasına neden olur.

3. Modern ve Güvenli Yöntem: let Kullanımı

ES6 (2015) sürümü ile JavaScript dünyasına katılan let, var‘ın yarattığı kapsam karmaşasını çözmek için tasarlanmıştır,.

Blok Kapsamına Sahiptir: let ile tanımladığınız bir değişken, sadece onu çevreleyen süslü parantezler { } içinde yaşar ve bu blok sona erdiğinde değişken belleğinden silinir.

function calis() {
    if (true) {
        let yeniMesaj = "Sadece burada geçerliyim!";
    }
    console.log(yeniMesaj); // ReferenceError: yeniMesaj is not defined
}
calis();

Yukarıdaki kodda let kullandığımız için, if bloğunun dışına çıktığımız anda JavaScript bize bir referans hatası (ReferenceError) verir. Çünkü değişkenin yaşam alanı (scope) sadece o bloğun içidir. Bu özellik kodun daha öngörülebilir olmasını, değişkenlerin birbirine karışmamasını ve temiz (clean) bir yapıya sahip olmasını sağlar. Ayrıca aynı kapsam içerisinde let ile aynı isimde iki değişken tanımlayamazsınız, bu da yanlışlıkla bir değişkenin üzerine yazmanızı engeller.

4. Sabit Değerler İçin: const Kullanımı

Kelimelerin anlamlarından da yola çıkabileceğimiz gibi (constant = sabit), kodun çalışma süresi boyunca değeri hiçbir zaman değişmeyecek olan değişkenler için const kullanılır.

Tıpkı let gibi const da blok kapsamlıdır,. En büyük farkı, const ile tanımlanan bir değişkene sadece bir kez değer atanabilir ve sonradan yeni bir değer atanamaz (reassignment yapılamaz).

const pi = 3.14159;
console.log(pi); // Çıktı: 3.14159

pi = 3; // Uncaught TypeError: Assignment to constant variable.

Yukarıdaki örnekte görüldüğü üzere pi değişkenine yeni bir değer atamaya çalıştığımızda JavaScript TypeError hatası fırlatarak buna engel olur.

Önemli Bir İstisna (Diziler ve Nesneler): const kelimesi değişkenin bellek referansını (işaret ettiği yeri) kilitler, içindeki verileri değil. Bu yüzden bir dizi (array) veya nesne (object) const ile tanımlansa bile, onun içindeki elemanları değiştirebilirsiniz. Ancak dizinin veya nesnenin tamamını yeni bir dizi veya nesneyle değiştiremezsiniz.

const arabalar = ["Toyota", "Ford"];
arabalar = "Tesla"; // Bu işlem geçerlidir. Elemanı güncelleyebiliriz.
console.log(arabalar); // Çıktı: Tesla

// Ancak diziyi tamamen yeniden atamaya çalışırsak hata alırız:
arabalar = ["Honda"]; // TypeError fırlatır!

5. var ile let/const Arasındaki “Hoisting” (Yukarı Taşıma) Farkı

JavaScript’in motoru kodları çalıştırmadan önce dosyayı hızlıca tarar ve tüm değişken tanımlamalarını hafızaya alarak kapsamın (scope) en üstüne taşır. Bu mekanizmaya Hoisting denir.

var ile oluşturulan değişkenler, tanımlanmalarından önce kodun üst kısımlarında kullanılmaya çalışılırsa hata vermez, yalnızca undefined (tanımsız) değerini döndürür,.

console.log(sayi); // Çıktı: undefined
var sayi = 5;

Oysa aynı işlemi let veya const ile yapmaya kalkarsak JavaScript bize hata verecektir,. Çünkü let ve const da hafızaya alınır ancak onlara değer atanana kadar “Geçici Ölü Bölge” (Temporal Dead Zone) adı verilen bir alanda tutulurlar.

console.log(rakam); // ReferenceError: Cannot access 'rakam' before initialization
let rakam = 10;

Bu davranış, let ve const‘un güvenilirliğini kanıtlar; çünkü bir değişkeni tanımlamadan onu okumaya veya değiştirmeye çalışmak her zaman yazılım dünyasında büyük bir mimari hata olarak kabul edilir.

6. Döngülerde (Loops) Neden var Yerine let Kullanmalıyız?

ES6 öncesinde, for döngüleri içinde closure (kapanış) mekanizmaları yaratılırken yaygın bir “Döngü Problemi” ortaya çıkardı. var blok kapsamına sahip olmadığı için (fonksiyon kapsamlı olduğu için), döngü değişkeni her bir iterasyonda sürekli güncellenir ve tek bir paylaşılan değişken bellekte tutulurdu.

Örneğin, döngü içerisinde setTimeout gibi asenkron (gecikmeli) bir işlem yapılırsa, döngü bittiği andaki en son değer bütün gecikmeli fonksiyonlara yansırdı.

Bunu aşmak için yeni nesil kodlamada for döngülerinde var yerine let kullanırız. let blok kapsamlı (block-scoped) olduğu için, döngünün çalıştığı her yeni turda (iterasyon) o tura özel yepyeni bir değişken yaratır ve bu değişken belleğe düzgün şekilde hapsolur. Bu, özellikle kullanıcının verilerini izleyen dinamik listeler veya zamanlayıcı (timer) uygulamaları tasarlarken karşınıza çıkacak büyük hataları engeller.

Özet ve En İyi Kullanım Stratejisi (Best Practices)

Günümüz modern 2026 JavaScript dünyasında web uygulamaları veya sunucu (Node.js) kodları yazarken geliştiricilerin ortak olarak kabul ettiği standartlar şunlardır:

  1. Varsayılan Olarak Her Zaman const Kullanın: Oluşturduğunuz bir verinin, uygulamanın geri kalanı boyunca değişmeyeceğini biliyorsanız (örneğin bir HTML elementini seçerken, formülleri tutarken, ya da sunucu URL’lerini saklarken), doğrudan const kullanın. Bu, kodunuzu okuyan başka bir yazılımcıya “Bu değer asla değişmeyecek” mesajını en baştan verir.
  2. Sadece Değişmesi Gereken Verilerde let Kullanın: Sayaçlar, formlarda kullanıcının girdiği güncel metinler, döngü (for) indeksleri veya çalışma zamanında değerleri değişecek dinamik durumlar için let kullanın.
  3. var Kullanmayı Bırakın: Eski, miras kalmış (legacy) kod tabanlarıyla veya eski standartlara bağımlı araçlarla çalışmıyorsanız var kelimesini yeni projelerinizde kullanmaktan tamamen kaçının. ES6’nın sağladığı let ve const, blok tabanlı mimarisiyle eski hataların tamamının önüne geçmektedir.

Değişkenler bir dildeki en temel yapılardır. Temeli sağlam atmak, üzerine inşa edeceğiniz if-else sorguları, döngüler ve fonksiyonlar gibi diğer tüm konularda sorunsuz, güvenli ve hatasız bir programlama deneyimi yaşamanızı sağlayacaktır. Artık değişkenleri yönetmeye hazır olduğunuza göre, kendi web tarayıcınızın geliştirici konsolunu açıp pratiklere başlayabilirsiniz!

Etiketlendi:

Cevap bırakın

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