Giriş
JavaScript, web ve uygulama geliştirmede yaygın kullanılan bir programlama dilidir. Bu rehber, yeni başlayanların değişkenleri nasıl tanımlayacağını ve programın yürütülme sırasını belirleyen kontrol akışı yapılarını nasıl kullanacağını adım adım açıklar. Temel kavramları öğrenirken küçük örneklerle deneme yapmanız en etkili yoldur. Resmi ve güncel açıklamalar için MDN ve web.dev kaynaklarını inceleyebilirsiniz: MDN JavaScript Guide ve web.dev - Kontrol akışı.
Değişkenler: var, let ve const
JavaScript'te veriyi saklamak için değişkenler kullanılır. Üç ana bildirim yolu vardır: var, let ve const. Her birinin kapsam ve yeniden atama davranışı farklıdır. Var hakkında teknik referans için bkz: var bildirimi (Microsoft Docs), daha geniş rehberlik için MDN faydalıdır.
var
var ile tanımlanan değişkenler fonksiyon veya global kapsamda tanımlanır; blok (if/for gibi) kapsamında yeni bir bağlam oluşturmaz. Bu durum bazı senaryolarda beklenmeyen sonuca yol açabilir:
var x = 1; if (true) { var x = 2; console.log(x); // 2 } console.log(x); // 2
Örnekten görüldüğü gibi if bloğu içindeki değişiklik, dışarıdaki x değerini etkiler. Modern JavaScript'te çoğunlukla let veya const tercih edilir.
let ve const
let ve const ES6 ile gelen, blok kapsamlı (block-scoped) değişkenlerdir. let ile tanımlanan değişkenler yeniden atanabilir; const ile tanımlanan bağlama yeniden atama yapılamaz. Ancak const ile oluşturulmuş bir nesnenin içindeki özellikler değiştirilebilir—bağlama sabittir, nesnenin içeriği sabit değildir. Bu davranışlar MDN rehberinde detaylı olarak ele alınmıştır.
let sayi = 10; sayi = 20; // geçerli const kisi = { isim: "Ayşe" }; kisi.isim = "Mehmet"; // nesne içi değişiklik geçerli // kisi = { isim: "Ali" }; // yeniden atama -> hata
Kapsam (Scope) ve Hoisting
Kapsam (scope), bir değişkene kodun hangi noktalarından erişilebileceğini belirler. var fonksiyon veya global kapsamında iken, let ve const blok kapsamlıdır. Bir diğer önemli kavram hoisting (yükseltme) olarak adlandırılır: bildirimler yürütmeden önce 'bildirilir', ancak değer atama ve erişim davranışı bildirim türüne göre farklılık gösterir.
var bildirimleri yükseltilir ve bildirilmelerine rağmen erişim undefined dönebilir; let ve const için ise bildirilmelerinden önce erişim, Temporal Dead Zone nedeniyle ReferenceError ile sonuçlanır:
console.log(a); // undefined var a = 5; console.log(b); // ReferenceError let b = 5;
Bu yüzden değişkeninizi kullanmadan önce mutlaka tanımlamak ve mümkünse en dar kapsamda tanımlamak en iyi uygulamalardandır.
Kontrol Akışı: Koşullar ve Döngüler
Kontrol akışı, programınızın hangi adımları hangi koşullarda izleyeceğini belirler. Temel yapılar if/else, switch ve döngülerdir. Web.dev'in kontrol akışı rehberi temel kavramları açıklar: web.dev - Kontrol akışı.
Koşullu İfadeler (if / else / switch)
Basit bir if/else kullanımı:
const not = 75; if (not >= 90) { console.log("A"); } else if (not >= 70) { console.log("B"); } else { console.log("C"); }
switch yapılandırılmış durum kontrolü için okunabilir bir alternatif sağlar:
const gun = "Pazartesi"; switch (gun) { case "Pazar": console.log("Hafta sonu"); break; case "Pazartesi": console.log("Hafta başı"); break; default: console.log("Ara gün"); }
Döngüler (for / while / do...while)
Döngüler tekrarlı işlemler için kullanılır. Örnekler:
for (let i = 0; i < 5; i++) { console.log(i); } let j = 0; while (j < 5) { console.log(j); j++; } let k = 0; do { console.log(k); k++; } while (k < 5);
Örnek: Döngü içinde kapsam farkı
var ile döngü içinde oluşturulan kapatmalar (closures) beklenmeyen sonuç verebilir; let ile bu sorun ortadan kalkar:
var funcs = []; for (var i = 0; i < 3; i++) { funcs.push(function() { console.log(i); }); } funcs[0](); // 3 funcs[1](); // 3 funcs[2](); // 3 // let ile çözüm: let funcs2 = []; for (let i = 0; i < 3; i++) { funcs2.push(function() { console.log(i); }); } funcs2[0](); // 0
Hata Yönetimi: try...catch
try...catch blokları, çalışma zamanı hatalarını yakalamak ve programın beklenmedik şekilde durmasını engellemek için kullanılır. Hataları yakalarken, hatayı kaydetmek ve uygun geri bildirim sağlamak önemlidir.
try { JSON.parse("geçersiz-json"); } catch (e) { console.error("Hata yakalandı:", e); } finally { console.log("Temizleme veya kapanış işleri"); }
Dikkat: try...catch yalnızca eşzamanlı (synchronous) kodun içindeki hataları yakalar. Promise tabanlı asenkron işlemler için .catch() veya async/await ile try/catch kombinasyonu kullanılmalıdır:
// Promise ile fetch('/data.json') .then(r => r.json()) .catch(err => console.error(err)); // async/await ile async function load() { try { const r = await fetch('/data.json'); const data = await r.json(); } catch (err) { console.error(err); } }
İyi Uygulamalar ve İpuçları
- Varsayılan olarak const ile başlayın; gerekiyorsa let kullanın.
- Global alanı mümkün olduğunca kirletmeyin; modüller ve fonksiyonlar içinde değişken tanımlayın.
- Açıklayıcı değişken isimleri kullanın (ör. adet, kullaniciAdi).
- Koşullar ve döngülerde karmaşıklığı azaltmak için yardımcı fonksiyonlar yazın.
- Hataları anlamak için console.log ve tarayıcı debugger araçlarını kullanın.
Hızlı Alıştırmalar
- Tarayıcı konsolunda farklı bildirim türlerini (var/let/const) deneyin ve kapsam etkilerini gözlemleyin.
- 100 üzerinden not alan bir fonksiyon yazın ve if/else ile harf notu döndüren bir yapı oluşturun.
- Bir dizi içindeki sayıları toplayan bir for döngüsü yazın; sonuçları konsolda gösterin.
Kaynaklar ve İleri Okuma
- JavaScript Guide — MDN
- Kontrol akışı — web.dev
- var bildirimi — Microsoft Docs
- JavaScript Variables — W3Schools
Not: Bu yazı temel kavramları uygulamalı örneklerle öğretmeyi amaçlar. Gelişmiş konular (çalışma zamanı optimizasyonları, derin JS iç mekanikleri, tarayıcı uyumluluğu detayları) için resmi dokümantasyon ve ek kaynaklar incelenmelidir.