11. ders · Metin ders

Kapsam (scope) ve kaldırma (hoisting) nasıl çalışır?

  • 11 dk
  • Akış Denetimi ve Fonksiyonlar
  • Önizlemeye açık

Bir önceki bölümde değişken türlerinin görünürlük alanlarını karşılaştırmıştık. Şimdi bir adım geriye çekilip motorun kodunuzu hangi sırayla ele aldığına bakalım. JavaScript bir fonksiyonu çalıştırmadan önce onu okur, iç…

Bir önceki bölümde değişken türlerinin görünürlük alanlarını karşılaştırmıştık. Şimdi bir adım geriye çekilip motorun kodunuzu hangi sırayla ele aldığına bakalım. JavaScript bir fonksiyonu çalıştırmadan önce onu okur, içindeki tanımları not eder ve ancak ondan sonra satırları yürütür. Bu iki aşamalı davranışa hoisting (kaldırma) denir.

Kapsam zinciri

Her fonksiyon çağrısı kendi kapsamını yaratır. Bir isim arandığında motor önce içinde bulunduğu kapsama, bulamazsa bir üsttekine, oradan da bulamazsa küresel kapsama bakar. Bu ardışık aramaya kapsam zinciri denir ve tek yönlüdür: iç kapsam dışarıyı görür, dış kapsam içeriyi göremez.

const uygulamaAdi = "Defter";

function disKapsam() {
  const kullanici = "Ayşe";

  function icKapsam() {
    console.log(uygulamaAdi, kullanici); // Defter Ayşe
  }

  icKapsam();
}

disKapsam();
console.log(kullanici); // ReferenceError

Bu kural, bir fonksiyonun tanımlandığı yerdeki değişkenleri sonradan da hatırlamasını sağlar; kapanış (closure) dediğimiz davranışın temeli budur.

Ne kaldırılır, ne kaldırılmaz?

Kaldırma her tanım türü için aynı işlemez:

  1. Fonksiyon bildirimleri gövdeleriyle birlikte kaldırılır; tanımdan önce çağırabilirsiniz.
  2. var değişkenleri yalnızca isim olarak kaldırılır, değeri atanmaz; erken okursanız undefined alırsınız.
  3. let ve const de kaldırılır ama başlatılmaz; tanım satırına kadar geçici ölü bölgededirler ve okumaya çalışmak hata fırlatır.
selamla();                  // "Merhaba" — çalışır
console.log(sayac);         // undefined
console.log(toplam);        // ReferenceError

function selamla() { console.log("Merhaba"); }
var sayac = 0;
let toplam = 0;

Fonksiyon ifadeleri farklıdır

Bir fonksiyonu değişkene atarsanız, kaldırma kuralı artık fonksiyonun değil değişkenin kuralıdır:

hesapla(); // TypeError: hesapla is not a function

var hesapla = function () { return 42; };

Burada hesapla ismi kaldırılmıştır ama değeri hâlâ undefined'dır; undefined'ı çağırmaya çalıştığınız için tür hatası alırsınız.

Küresel kapsamı kirletmemek

Bir değişkeni hiçbir anahtar kelime kullanmadan atarsanız (toplam = 5;), katı olmayan modda o değişken sessizce küresel kapsama yazılır ve dosyanın her yerinden erişilebilir hâle gelir. Aynı ismi başka bir dosyada da kullanırsanız ikisi birbirini ezer ve teşhisi çok zor bir hata çıkar. Dosyanın başına "use strict"; yazmak ya da modül (type="module") kullanmak bu durumu doğrudan hataya çevirir:

"use strict";

function say() {
  adet = 1; // ReferenceError: adet is not defined
}

Pratik ipucu: Hoisting'i kodunuzda bir özellik gibi kullanmayın. Değişkenleri kullanacağınız yere en yakın satırda tanımlayın ve yardımcı fonksiyonları çağrıldıkları yerin üstüne koyun. Böylece dosyayı yukarıdan aşağıya okuyan biri, motorun iki aşamalı davranışını bilmeden de kodu doğru anlar. Kaldırma bilgisi asıl olarak başkasının yazdığı tuhaf davranan kodu teşhis ederken işinize yarar.

Bu derste indirilebilir dosya yok

Kursun diğer derslerinde alıştırma dosyaları ve şablonlar bulunuyor.

TA
Tuğçe A. · 18 Haziran 2026

Fonksiyon içinde var ile tanımladığım değişkene, tanımlamadan önceki satırda eriştiğimde hata almadım ama değeri undefined geldi. let ile aynı şeyi yapınca hata aldım. Bu farkın sebebi tam olarak nedir?

DA
Deniz Arkın Eğitmen

İkisi de kaldırılıyor ama farklı şekilde. var ile tanımlanan değişken fonksiyonun başına kaldırılıp undefined ile başlatılır, bu yüzden erken erişimde hata yerine undefined alırsınız. let ve const de kaldırılır ancak tanım satırına gelene kadar başlatılmamış sayılırlar; bu aralığa geçici ölü bölge denir ve içinde erişim ReferenceError verir. Pratikte bu, let ve const kullanmanın hatayı erken yakalamanızı sağladığı anlamına gelir.

Soru sormak için kursa kaydolmanız gerekiyor.

Not almak için kursa kaydolun

Kayıtlı öğrenciler her ders için not tutabilir; notlar öğrenci panelinde toplanır.

Kursa git