Tüm blog yazıları

JavaScript'in Tek İş Parçacıklı Yapısı ve Web API'ler

JavaScript tek iş parçacıklı olsa da web sayfaları donmaz. Nasıl mı? Bu yazıda, tarayıcıların sunduğu Web API'lerinin JavaScript'e nasıl 'süper güçler' kattığını ve asenkron görevleri sorunsuz yöneterek uygulamaları akıcı tuttuğunu keşfedin.

eminbasbayan5 dk okuma
JavaScript tek iş parçacıklı yapısını ve Web API'leri ile asenkron çalışma modelini gösteren görsel.

Bir önceki makalede Call Stack'i öğrendik. Şimdi akıllara şu soru geliyor: "JavaScript aynı anda sadece bir şey yapabiliyorsa, 3 saniyelik bir zamanlayıcı çalışırken her şey durur mu?" Cevap: Hayır! İşte bu makalede JavaScript'in bu "sihri" nasıl yaptığını öğreneceğiz.

Single-Threaded (Tek İş Parçacıklı) Ne Demek?

JavaScript single-threaded bir dildir. Bu, herhangi bir anda en fazla bir satır kodun çalıştığı anlamına gelir. JavaScript aynı anda iki işi yapamaz - multitasking yapamaz.

Görsel Analoji

Bir restoranda tek garson düşünün:

  • Garson aynı anda sadece bir masaya hizmet edebilir
  • Sipariş alırken başka bir masaya koşamaz
  • Ama peş peşe hızlıca farklı masalara gidebilir

İşte JavaScript de böyle çalışır - çok hızlı, ama tek seferde tek iş.

Problem: Zaman Alan İşlemler

Eğer JavaScript tek iş parçacıklıysa, şu kod ne olur?

javascript
console.log("Başladı");

// 5 saniye bekle (gerçek dünyada API çağrısı olabilir)
// ???

console.log("Bitti");

Eğer JavaScript 5 saniye boyunca "bekleseydi", tüm sayfa donardı:

  • Butonlara tıklayamazdınız
  • Scroll çalışmazdı
  • Hiçbir animasyon olmazdı

Neyse ki, bu böyle çalışmıyor!

Web API'ler: Tarayıcının Süper Güçleri

İşte sihrin kaynağı: Web API'ler

Tarayıcılar (Chrome, Firefox, Safari) JavaScript'ten çok daha fazlasını yapabilir. Tarayıcılar genellikle C++ gibi dillerle yazılmıştır ve JavaScript'in yapamadığı işleri üstlenirler.

JavaScript'in Tarayıcıya Devrettiği İşler

İşlemWeb API
ZamanlayıcılarsetTimeout, setInterval
HTTP İsteklerifetch, XMLHttpRequest
DOM OlaylarıEvent Listeners
Konum BilgisiGeolocation API
Yerel DepolamalocalStorage, sessionStorage

setTimeout Nasıl Çalışır?

javascript
console.log("1 - Başladı");

setTimeout(function() {
    console.log("2 - Zamanlayıcı bitti");
}, 3000);

console.log("3 - Devam ediyor");

Çıktı sırası:

metin
1 - Başladı
3 - Devam ediyor
(3 saniye sonra)
2 - Zamanlayıcı bitti

Sahne Arkası

metin
┌─────────────────────────────────────────────────────────────────┐
│                         TARAYICI                                 │
│  ┌──────────────┐    ┌──────────────────────────────────────┐   │
│  │  JavaScript  │    │           Web API'ler                 │   │
│  │   Motoru     │    │  ┌─────────────────────────────────┐ │   │
│  │              │───▶│  │ setTimeout: 3 saniye bekle...   │ │   │
│  │  Call Stack  │    │  │ (JavaScript bu sırada boş!)     │ │   │
│  │              │◀───│  │ ...3 saniye doldu, callback'i   │ │   │
│  │              │    │  │    geri gönder                   │ │   │
│  └──────────────┘    │  └─────────────────────────────────┘ │   │
│                       └──────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────┘

Adım adım:

  1. JavaScript setTimeout'u görür
  2. "Hey tarayıcı, 3 saniye say ve sonra bu fonksiyonu çalıştır" der
  3. JavaScript durmuyor, hemen sonraki satıra geçiyor
  4. Tarayıcı arka planda sayıyor (JavaScript bunu yapmıyor!)
  5. 3 saniye dolunca, tarayıcı callback'i "callback queue"ya ekler
  6. JavaScript boşaldığında (Call Stack boş), callback çalışır

Gerçek Hayat Örneği: Veri Yükleme Simülasyonu

javascript
console.log("📱 Uygulama başlatılıyor...");

// Kullanıcı verilerini "yükle" (simülasyon)
setTimeout(function() {
    console.log("👤 Kullanıcı verileri yüklendi");
}, 2000);

// Ürünleri "yükle" (simülasyon)
setTimeout(function() {
    console.log("🛒 Ürünler yüklendi");
}, 1000);

// Bildirimleri "yükle" (simülasyon)
setTimeout(function() {
    console.log("🔔 Bildirimler yüklendi");
}, 1500);

console.log("⏳ Veriler yükleniyor...");

Çıktı:

metin
📱 Uygulama başlatılıyor...
⏳ Veriler yükleniyor...
(1 saniye sonra) 🛒 Ürünler yüklendi
(1.5 saniye sonra) 🔔 Bildirimler yüklendi
(2 saniye sonra) 👤 Kullanıcı verileri yüklendi

Dikkat edin: Kod sırasına göre değil, süre sırasına göre çalıştı!

0 Milisaniye setTimeout Bile Bekler!

javascript
console.log("Birinci");

setTimeout(function() {
    console.log("İkinci");
}, 0); // 0 milisaniye!

console.log("Üçüncü");

Çıktı:

metin
Birinci
Üçüncü
İkinci

Neden? Çünkü setTimeout her zaman Web API'ye gider, 0 ms bile olsa. Callback, Call Stack tamamen boşaldıktan sonra çalışır.

Event Loop: Orkestra Şefi

Tüm bu koordinasyonu sağlayan mekanizmaya Event Loop denir:

metin
┌─────────────────────────────────────────────────────────────┐
│                       EVENT LOOP                             │
│                                                              │
│   ┌──────────┐      ┌──────────┐      ┌──────────────────┐  │
│   │  Call    │      │  Web     │      │  Callback        │  │
│   │  Stack   │ ───▶ │  APIs    │ ───▶ │  Queue           │  │
│   │          │      │          │      │                  │  │
│   └──────────┘      └──────────┘      └──────────────────┘  │
│        ▲                                      │              │
│        └──────────────────────────────────────┘              │
│              (Stack boşsa, queue'dan al)                     │
└─────────────────────────────────────────────────────────────┘
  1. Call Stack: Şu an çalışan kod
  2. Web APIs: Tarayıcının yönettiği asenkron işlemler
  3. Callback Queue: Çalışmaya hazır callback'ler sırası
  4. Event Loop: Stack boş mu diye kontrol eden mekanizma

Gerçek Hayat Örneği: Buton Tıklama

javascript
const buton = document.querySelector('#yukleBtn');

buton.addEventListener('click', function() {
    console.log("Buton tıklandı!");
    
    // API'den veri çek (simülasyon)
    setTimeout(function() {
        console.log("Veriler geldi!");
        // Sayfayı güncelle
    }, 2000);
    
    console.log("Yükleniyor...");
});

console.log("Sayfa hazır, butona tıklayabilirsiniz.");

Kullanıcı butona tıkladığında:

metin
Sayfa hazır, butona tıklayabilirsiniz.
(kullanıcı tıklar)
Buton tıklandı!
Yükleniyor...
(2 saniye sonra)
Veriler geldi!

Bloklamayan (Non-Blocking) Kod

Bu yapı sayesinde JavaScript bloklamayan (non-blocking) çalışır:

javascript
// ❌ Bloklayan kod (JavaScript'te bu şekilde bekleyemezsiniz)
console.log("Başla");
bekle(3000); // JavaScript'te böyle bir fonksiyon yok!
console.log("3 saniye sonra");

// ✅ Bloklamayan kod (doğru yol)
console.log("Başla");
setTimeout(function() {
    console.log("3 saniye sonra");
}, 3000);
console.log("Bu hemen çalışır");

Özet

Bu makalede öğrendiklerimiz:

✅ JavaScript single-threaded'dır - aynı anda tek iş yapar
✅ Web API'ler zaman alan işleri tarayıcıya devreder
✅ setTimeout JavaScript'i bloklamaz, tarayıcı sayar
✅ Event Loop, callback'leri Call Stack'e geri getirir
✅ Bu yapı sayesinde JavaScript non-blocking çalışır

Bir sonraki makalede bu asenkron yapının getirdiği sorunu - Callback Hell - ve nasıl çözülebileceğini göreceğ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