Tüm blog yazıları

JavaScript Call Stack: Kodunuzun Sahne Arkası

JavaScript kodunuzun sahne arkasını merak mı ediyorsunuz? Fonksiyon çağrılarının, değerlerin ve tüm karmaşıklığın JavaScript motoru tarafından Call Stack (Çağrı Yığını) ile nasıl yönetildiğini keşfedin. Bu temel mekanizmayı basit örneklerle kolayca anlayın.

eminbasbayan4 dk okuma
JavaScript Call Stack'in çalışma prensibini gösteren diyagram: Üst üste duran fonksiyon çağrıları yığını.

JavaScript kodunuz çalışırken, her şey bir sihir gibi görünebilir. Bir fonksiyon çağırıyorsunuz, o başka bir fonksiyonu çağırıyor, değerler dönüyor ve sonuç ekrana yazılıyor. Peki ama JavaScript tüm bu karmaşıklığı nasıl yönetiyor? İşte burada Call Stack (Çağrı Yığını) devreye giriyor.

Call Stack Nedir?

Call Stack, JavaScript motorunun fonksiyon çağrılarını takip etmek için kullandığı bir mekanizmadır. Tıpkı bir kitapta sayfa işareti kullanmak gibi - JavaScript hangi fonksiyonun içinde olduğunu, nereden geldiğini ve nereye döneceğini bu yapı sayesinde bilir.

Stack (Yığın) Kavramı

"Stack" kelimesi, üst üste dizilmiş nesneler anlamına gelir. Gerçek hayatta bir tabak yığını düşünün:

  • Yeni bir tabak eklerken en üste koyarsınız
  • Bir tabak alırken de en üstten alırsınız
  • En alttaki tabağa ulaşmak için önce üsttekileri almanız gerekir

Bu yapıya LIFO (Last In, First Out - Son Giren, İlk Çıkar) denir.

Basit Bir Örnek

javascript
function selamVer(isim) {
    const mesaj = mesajOlustur(isim);
    console.log(mesaj);
}

function mesajOlustur(isim) {
    return "Merhaba, " + isim.toUpperCase() + "!";
}

selamVer("Ahmet");

Bu kod çalıştığında Call Stack şu şekilde değişir:

Adım 1: selamVer("Ahmet") çağrılır

metin
┌─────────────────┐
│ selamVer("Ahmet")│
└─────────────────┘

Adım 2: selamVer içinden mesajOlustur(isim) çağrılır

metin
┌───────────────────────┐
│ mesajOlustur("Ahmet") │  ← En üstte (şu an çalışan)
├───────────────────────┤
│ selamVer("Ahmet")     │  ← Bekliyor
└───────────────────────┘

Adım 3: mesajOlustur sonuç döndürür ve stack'ten çıkar

metin
┌─────────────────┐
│ selamVer("Ahmet")│  ← Devam ediyor
└─────────────────┘

Adım 4: selamVer tamamlanır ve stack boşalır

metin
(boş)

Gerçek Hayat Örneği: İç İçe Hesaplama

javascript
function fiyatHesapla(miktar, birimFiyat) {
    const toplamFiyat = carpim(miktar, birimFiyat);
    const kdvliFiyat = kdvEkle(toplamFiyat);
    return kdvliFiyat;
}

function carpim(a, b) {
    return a * b;
}

function kdvEkle(fiyat) {
    const kdvOrani = kdvOraniGetir();
    return fiyat + (fiyat * kdvOrani);
}

function kdvOraniGetir() {
    return 0.20; // %20 KDV
}

const sonFiyat = fiyatHesapla(5, 100);
console.log("Son fiyat:", sonFiyat); // 600

Call Stack Akışı

metin
1. fiyatHesapla(5, 100)     → Stack'e eklendi
2. carpim(5, 100)            → Stack'e eklendi
   carpim 500 döndürdü       → Stack'ten çıktı
3. kdvEkle(500)              → Stack'e eklendi
4. kdvOraniGetir()           → Stack'e eklendi
   kdvOraniGetir 0.20 döndürdü → Stack'ten çıktı
   kdvEkle 600 döndürdü      → Stack'ten çıktı
5. fiyatHesapla 600 döndürdü → Stack'ten çıktı

Stack Overflow (Yığın Taşması)

Call Stack'in bir sınırı vardır. Eğer çok fazla fonksiyon iç içe çağrılırsa veya sonsuz döngü oluşursa "Stack Overflow" hatası alınır.

javascript
// ⚠️ DİKKAT: Bu kod Stack Overflow hatası verir!
function sonsuzDongu() {
    return sonsuzDongu(); // Kendini çağırıyor
}

sonsuzDongu(); // Maximum call stack size exceeded

Doğru Recursive (Özyinelemeli) Kullanım

javascript
function faktoriyel(n) {
    // Dur koşulu - bu olmadan sonsuz döngüye girer!
    if (n <= 1) {
        return 1;
    }
    return n * faktoriyel(n - 1);
}

console.log(faktoriyel(5)); // 120

Call Stack görünümü (faktoriyel(5) için):

metin
faktoriyel(5)
  → faktoriyel(4)
    → faktoriyel(3)
      → faktoriyel(2)
        → faktoriyel(1) → 1 döndür
      → 2 * 1 = 2 döndür
    → 3 * 2 = 6 döndür
  → 4 * 6 = 24 döndür
→ 5 * 24 = 120 döndür

Chrome DevTools ile Call Stack'i Görme

Tarayıcınızda Call Stack'i gerçek zamanlı görebilirsiniz:

  1. Chrome'da F12 tuşuna basın (DevTools açılır)
  2. Sources sekmesine gidin
  3. JavaScript dosyanızı bulun
  4. Satır numarasına tıklayarak breakpoint ekleyin
  5. Sayfayı yenileyin
  6. Sağ tarafta Call Stack panelini görün

Neden Önemli?

Call Stack'i anlamak şu durumlarda yardımcı olur:

✅ Hata ayıklama: Hata mesajlarındaki "stack trace" artık anlam kazanır
✅ Performans: Çok derin fonksiyon zincirleri performansı etkiler
✅ Asenkron kod: Bir sonraki konumuz - JavaScript'in tek iş parçacıklı yapısı
✅ Recursive fonksiyonlar: Ne zaman duracağını planlamak için

Hata Mesajlarını Okuma

Bir hata aldığınızda, stack trace size tam olarak hatanın nerede oluştuğunu gösterir:

metin
Uncaught TypeError: Cannot read property 'length' of undefined
    at dogrulaMetin (app.js:15)
    at formKontrol (app.js:8)
    at HTMLButtonElement.onclick (index.html:12)

Bu size şunu söylüyor:

  1. onclick tetiklendi (kullanıcı butona tıkladı)
  2. formKontrol fonksiyonu çağrıldı
  3. dogrulaMetin fonksiyonu çağrıldı
  4. Hata burada oluştu - bir şey undefined ve onun length özelliğine erişmeye çalışıyoruz

Özet

Bu makalede öğrendiklerimiz:

✅ Call Stack, JavaScript'in fonksiyon çağrılarını takip etme mekanizmasıdır
✅ LIFO prensibiyle çalışır - son giren ilk çıkar
✅ Her fonksiyon çağrısı stack'e eklenir, tamamlanınca çıkarılır
✅ Stack Overflow, çok fazla iç içe çağrıda oluşur
✅ Chrome DevTools ile Call Stack görselleştirilebilir

Bir sonraki makalede JavaScript'in Single-Threaded Yapısı ve Web API'ler konusunu inceleyeceğiz.

JavaScript Classes ile pratik uygulamalar, metotlar arası iletişim ve gerçek dünya kod örnekleri
JavaScript Dersleri9 dk okuma

JavaScript Classes - Pratik Uygulamalar

JavaScript class'ları ile pratik uygulamalara geçin! Metotlar arası iletişimden constructor'da metot çağırmaya, kod tekrarını azaltmaktan gerçek dünya senaryolarına kadar class kullanımının inceliklerini keşfedin. Kendi alışveriş sepeti örneğinizle bilginizi pekiştirin.

Yazıyı oku
JavaScript class yapısını gösteren bir kod örneği, ES6 ile modern nesne oluşturma
JavaScript Dersleri9 dk okuma

JavaScript Classes

ES6 ile JavaScript'e gelen class yapısı sayesinde nesne oluşturmak artık çok daha kolay ve düzenli! Constructor function karmaşasından kurtulup, okunabilir ve yönetilebilir kodlar yazmak isteyenler için modern JavaScript'in temel taşı olan class'ları tüm detaylarıyla keşfedin. Bu rehberle nesne şabl

Yazıyı oku
JavaScript kodunda Constructor Function ve new keyword'ü ile nesne oluşturma örnekleri
JavaScript Dersleri8 dk okuma

Constructor Functions ve new Keyword

Factory Function'ların hafıza israfı sorununa Constructor Function'lar ve new keyword'ü ile son verin! Metotları paylaştırarak JavaScript objelerini daha verimli nasıl oluşturacağınızı, new'in perde arkasında neler yaptığını ve prototype sisteminin gücünü bu rehberde keşfedin.

Yazıyı oku

Çerez tercihlerin

Platformun çalışması için zorunlu çerezler kullanıyoruz. İzin verirsen anonim kullanım verilerini ölçüyoruz. Ayrıntıları incele