JavaScript, bugün web'in üzerinde koştuğu programlama dilidir. Tarayıcıdaki bir butonun tıklamaya cevap vermesinden, arka planda çalışan bir sunucu servisine kadar çok geniş bir alanda kullanılır. Bu yazıda dilin ne olduğunu, nasıl ortaya çıktığını, nasıl çalıştığını ve nerede işe yaradığını tarafsız ve teknik bir çerçeveyle ele alıyoruz.
İlgili rehberler: Genel resim için programlama dilleri rehberi ana yazısına göz atabilir, sunucu tarafıyla karşılaştırmak için Node.js nedir? yazısını okuyabilirsin.
JavaScript nedir?
JavaScript; yüksek seviyeli, dinamik tipli, çok paradigmalı bir programlama dilidir. "Yüksek seviyeli" olması, bellek yönetimi gibi düşük seviyeli ayrıntılarla uğraşmadan kod yazabilmen anlamına gelir. "Dinamik tipli" olması ise bir değişkenin türünü çalışma anında belirlemesi demektir; aynı değişken önce bir sayı, sonra bir metin tutabilir.
Dil hem nesne yönelimli (prototip tabanlı), hem fonksiyonel, hem de olay güdümlü (event-driven) yaklaşımları destekler. Başlangıçta yalnızca tarayıcıda çalışan bir betik diliyken, bugün sunucularda, masaüstü uygulamalarında, mobil uygulamalarda ve gömülü sistemlerde de yer alır.
Kısa bir tarihçe
JavaScript, 1995 yılında Netscape'te Brendan Eich tarafından geliştirildi. Dil çok kısa bir sürede tasarlandı ve önce Mocha, ardından LiveScript, son olarak JavaScript adını aldı. Amaç, o dönemde popülerleşen web sayfalarına etkileşim katmaktı.
Diller arası uyumu sağlamak için dil, ECMA International tarafından standartlaştırıldı. Bu standardın adı ECMAScript, resmi belgesi ise ECMA-262'dir. "JavaScript" gündelik dilde bu standardın en yaygın uygulamasını anlatır.
İlk yıllarda JavaScript, çoğunlukla küçük süslemeler ve form doğrulamaları için kullanılıyordu; tarayıcılar arasındaki farklılıklar da geliştiricilerin işini zorlaştırıyordu. 2000'li yılların ortasında sayfayı yeniden yüklemeden sunucuyla veri alışverişi yapan yaklaşımın (AJAX olarak anılır) yaygınlaşması, dilin ciddi uygulamalar için de kullanılabileceğini gösterdi. Bu dönem, zengin web uygulamalarının önünü açtı.
JavaScript nasıl çalışır?
Kaynak kodu bir JavaScript motoru tarafından yorumlanır ve çalıştırılır. Modern motorlar, kodu daha hızlı işletmek için JIT (Just-In-Time) derleme teknikleri kullanır. Farklı tarayıcılar farklı motorlar barındırır:
| Motor | Kullanıldığı yer |
|---|---|
| V8 | Google Chrome, Microsoft Edge, Node.js |
| SpiderMonkey | Mozilla Firefox |
| JavaScriptCore | Safari (WebKit) |
JavaScript tek iş parçacıklı (single-threaded) bir modele dayanır; yani aynı anda tek bir kod parçasını yürütür. Uzun süren işlerin arayüzü dondurmasını önlemek için olay döngüsü (event loop) ve asenkron mekanizmalar kullanır. Bu tasarım, ağır I/O işlerinde bloklamadan, tepki verebilir kalmasına olanak tanır.
İşleyişin merkezinde bir çağrı yığını (call stack), bir görev kuyruğu ve olay döngüsü bulunur. Bir işlem tamamlandığında ilgili geri çağrım kuyruğa alınır; yığın boşaldığında olay döngüsü bekleyen işleri sırayla yığına taşır. Bu nedenle JavaScript'te "paralel" değil, "eş zamanlı" (concurrent) bir yürütme modelinden söz edilir. Yoğun hesaplama gerektiren işler için tarayıcı tarafında Web Worker iş parçacıkları, Node.js tarafında ise ayrı iş parçacığı mekanizmaları devreye alınabilir.
Temel dil özellikleri
- Dinamik ve zayıf tipleme: türler çalışma anında belirlenir ve gerektiğinde dönüştürülür.
- Prototip tabanlı nesne modeli: nesneler, sınıflar yerine doğrudan diğer nesnelerden özellik miras alabilir.
- Birinci sınıf fonksiyonlar: fonksiyonlar değişken gibi atanabilir, parametre olarak geçirilebilir ve döndürülebilir.
- Kapanış (closure) desteği: bir fonksiyon, tanımlandığı kapsamdaki değişkenlere sonradan da erişebilir.
- Otomatik çöp toplama (garbage collection): kullanılmayan bellek otomatik olarak geri alınır.
Veri türleri ve değişkenler
JavaScript'te değişkenler let, const ve daha eski var anahtar sözcükleriyle tanımlanır. Temel (ilkel) türler arasında sayı, metin, mantıksal değer, null, undefined, symbol ve büyük tam sayılar için bigint bulunur. Bunların dışında kalan her şey nesne olarak değerlendirilir.
// Degisken tanimlama
const ad = 'Ada'; // metin (string)
let yas = 30; // sayi (number)
let aktif = true; // mantiksal (boolean)
// Dinamik tipleme
let deger = 42;
deger = 'artik metin'; // ayni degisken, farkli tur
// Nesne ve dizi
const kullanici = { ad: 'Ada', yas: 30 };
const sayilar = [1, 2, 3, 4];
// Birinci sinif fonksiyon
const kare = (x) => x * x;
console.log(kare(5)); // 25DOM ve tarayıcı ortamı
Tarayıcıda JavaScript'in en görünür işi, sayfayla etkileşimdir. HTML belgesi bellekte DOM (Document Object Model) adı verilen bir ağaç yapısına dönüşür. JavaScript bu ağacı okuyabilir, değiştirebilir ve olaylara (tıklama, klavye, fare hareketi) tepki verebilir.
// Bir butona tiklama olayi baglama
const btn = document.querySelector('#kaydet');
btn.addEventListener('click', () => {
const kutu = document.querySelector('#mesaj');
kutu.textContent = 'Kaydedildi!';
});Tarayıcı ayrıca fetch, zamanlayıcılar, yerel depolama ve konum gibi birçok API'yi JavaScript'e sunar. Bu API'ler dilin bir parçası değildir; tarayıcının sağladığı ek yeteneklerdir. Bu ayrım önemlidir, çünkü aynı JavaScript kodu farklı ortamlarda çalışırken farklı API kümelerine erişir: tarayıcıda DOM ve pencere nesnesi bulunurken, Node.js tarafında dosya sistemi ve ağ soketleri gibi sunucuya özgü yetenekler devrededir.
Asenkron programlama
Ağ istekleri, dosya okuma veya zaman aşımı gibi işler zaman alır. JavaScript bu işlerde beklemek yerine, iş bitince çağrılacak bir mekanizma tanımlar. Bu amaçla geri çağrımlar (callback), Promise nesneleri ve async/await söz dizimi kullanılır.
// Promise ve async/await
async function veriGetir() {
try {
const yanit = await fetch('/api/haberler');
const veri = await yanit.json();
return veri;
} catch (hata) {
console.error('Istek basarisiz:', hata);
}
}
veriGetir().then((veri) => console.log(veri));Node.js ve sunucu tarafı
Uzun yıllar boyunca JavaScript yalnızca tarayıcıda çalıştı. 2009'da tanıtılan Node.js, V8 motorunu tarayıcıdan bağımsız çalıştırarak dili sunucuya taşıdı. Böylece aynı dille hem istemci hem de sunucu tarafı yazılabilir hale geldi.
Node.js, olaya dayalı ve engellemeyen (non-blocking) I/O modeli sayesinde çok sayıda eş zamanlı bağlantıyı verimli şekilde ele almak üzere tasarlanmıştır. Bu özellik, onu API sunucuları ve gerçek zamanlı servisler için yaygın bir seçim yapar. Daha yeni Deno ve Bun çalışma ortamları da benzer amaçlara hizmet eder; özellikle güvenlik varsayılanları ve geliştirici deneyimi gibi alanlarda farklı tercihler sunarlar.
Sunucu tarafında JavaScript kullanmanın pratik bir avantajı, ekipteki bilgi birikiminin ortak olmasıdır. Arayüzü yazan geliştirici, aynı dille yazılmış bir API katmanını da rahatça okuyabilir ve katkıda bulunabilir. Bu durum, özellikle küçük ve orta ölçekli ekiplerde geliştirme hızını olumlu etkiler.
Ekosistem: framework'ler ve araçlar
JavaScript'in gücü, büyük ölçüde etrafındaki ekosistemden gelir. Paket yöneticisi npm aracılığıyla çok geniş bir kitaplık havuzuna erişilir. Arayüz geliştirmede React, Vue, Angular ve Svelte gibi kütüphane ve çerçeveler öne çıkar.
- Arayüz (frontend): React, Vue, Angular, Svelte
- Sunucu (backend): Express, NestJS, Fastify gibi Node.js çerçeveleri
- Derleme ve paketleme: Vite, webpack, esbuild
- Tip güvenliği: TypeScript, JavaScript'in üstüne statik tipler ekleyen bir üst kümedir
Ekosistemin bu kadar geniş olmasının iki yüzü vardır. Bir yandan neredeyse her ihtiyaç için hazır bir çözüm bulunur; öte yandan bağımlılıkların güncel ve güvenli tutulması ayrı bir dikkat gerektirir. Üretim projelerinde kullandığın paketleri düzenli güncellemek ve gereksiz bağımlılıklardan kaçınmak, bakım yükünü düşüren pratiklerdendir. Bir başka dinamik dille kıyaslamak için PHP nedir? yazısı da faydalı bir referans olabilir.
JavaScript'i diğer dillerle karşılaştırmak
Aşağıdaki tablo, JavaScript'i sık kullanılan bazı dillerle kabaca karşılaştırır. Amaç bir dili diğerinden üstün göstermek değil, kullanım alanlarındaki farkları netleştirmektir.
| Özellik | JavaScript | Python | Java |
|---|---|---|---|
| Tip sistemi | Dinamik, zayıf | Dinamik, güçlü | Statik, güçlü |
| Ana çalışma yeri | Tarayıcı ve Node.js | Sunucu, veri bilimi | JVM (kurumsal, Android) |
| Eş zamanlılık | Olay döngüsü, async | Thread + async | Çok iş parçacıklı |
| Tipik kullanım | Web arayüzü, API | Otomasyon, ML, backend | Büyük kurumsal sistemler |
Karşılaştırma için Java nedir? yazısına da bakabilirsin; statik tipli ve derlenen bir dilin JavaScript'ten nasıl ayrıştığını görmek faydalı olur.
ECMAScript standardı ve sürümler
JavaScript'in çekirdek söz dizimi ve davranışı ECMAScript standardıyla belirlenir. 2015 yılında yayımlanan büyük sürüm (yaygın adıyla ES6 veya ES2015) dile let/const, ok fonksiyonları, sınıflar, modül yapısı ve Promise gibi önemli yenilikler getirdi. Bu sürümden sonra standart, yılda bir kez güncellenen bir ritme geçti.
JavaScript nerede kullanılır?
| Alan | Örnek kullanım |
|---|---|
| Web arayüzü | Etkileşimli sayfalar, tek sayfa uygulamalar (SPA) |
| Sunucu tarafı | REST/GraphQL API'leri, gerçek zamanlı servisler |
| Masaüstü | Electron tabanlı uygulamalar |
| Mobil | React Native gibi çerçeveler |
| Otomasyon | Yapı betikleri, test araçları |
Bu genişlik, JavaScript'i öğrenmeye değer kılan en önemli etkenlerden biridir: tek bir dille çok farklı katmanlarda üretim yapabilirsin. Web tabanlı bir haber sitesinin hem arayüz etkileşimleri hem de bazı sunucu servisleri aynı dille yazılabilir.
JavaScript neden bu kadar yaygın?
Bir dilin popülerliği yalnızca teknik özelliklerine bağlı değildir; erişim kolaylığı, ekosistemin büyüklüğü ve topluluğun genişliği de belirleyicidir. JavaScript bu açılardan avantajlı bir konumdadır:
- Her tarayıcıda hazır gelir; öğrenmeye başlamak için ek kurulum gerekmez.
- Aynı dille hem arayüz hem de sunucu yazılabilir, bu da ekiplerde iş bölümünü kolaylaştırır.
- npm üzerinde çok geniş bir hazır kütüphane havuzu bulunur.
- Geniş bir topluluk, bol miktarda öğrenme kaynağı ve örnek üretir.
- TypeScript gibi üst kümeler, büyük projelerde daha güvenli geliştirme sağlar.
Bu etkenler bir araya geldiğinde JavaScript, hem yeni başlayanlar hem de kurumsal ekipler için düşük giriş eşikli ama ölçeklenebilir bir seçenek haline gelir.
Sık sorulan sorular
JavaScript ile TypeScript arasındaki fark nedir?
TypeScript, JavaScript'in üstüne statik tip sistemi ekleyen bir üst kümedir. Geçerli her JavaScript kodu aynı zamanda geçerli TypeScript'tir. TypeScript kodu, tarayıcıda veya Node.js'te çalışmadan önce JavaScript'e çevrilir (derlenir).
JavaScript öğrenmek zor mu?
Temel söz dizimine başlamak görece kolaydır; değişken, fonksiyon ve döngü gibi kavramlar hızlı öğrenilir. Asenkron programlama, kapanış (closure) ve prototip modeli gibi konular ise biraz daha pratik gerektirir. Adım adım ilerlemek ve küçük projeler yapmak en sağlıklı yoldur.
JavaScript sadece web için mi kullanılır?
Hayır. Web arayüzü en yaygın kullanım alanı olsa da, Node.js ile sunucu servisleri, Electron ile masaüstü uygulamaları, React Native ile mobil uygulamalar ve çeşitli otomasyon betikleri de JavaScript ile yazılabilir.
Özet: JavaScript, web'in etkileşim katmanını doğurmuş, zamanla sunucudan masaüstüne kadar geniş bir alana yayılmış dinamik bir dildir. Prototip tabanlı nesne modeli, birinci sınıf fonksiyonları ve olay döngüsü tabanlı asenkron yapısı onu özgün kılar. Sağlam bir temel kurmak, sonrasında TypeScript ve modern çerçeveleri öğrenmeyi kolaylaştırır. Diğer dillerle nasıl bir tabloya oturduğunu görmek için programlama dilleri rehberi yazısını incelemeni öneririz.