« Tüm yayınlar

JavaScript Hoisting Aslında Nasıl Çalışır?

Hoisting kod taşıma değil, bellek ayırma sürecidir. var, let, const ve fonksiyonların motor içinde nasıl işlendiğini örneklerle inceliyoruz.

JavaScript'te 'değişkenler dosyanın başına taşınır' açıklaması yaygın olsa da teknik olarak yanlıştır. Gerçekte motor, kodu çalıştırmadan önce bir bellek hazırlama aşamasından geçer: önce tüm değişken ve fonksiyon tanımlarını tarayıp bellekte yer ayırır (Memory Creation Phase), ardından kodu satır satır çalıştırır (Execution Phase). Hoisting dediğimiz davranış bu iki aşamalı modelin doğal bir sonucudur.

Bu ayrım, var, let ve const arasındaki farkları netleştirir. var ile tanımlanan değişkenler bellek aşamasında otomatik olarak undefined ile başlatılır, bu yüzden tanımlanmadan önce erişilse bile hata vermez. Fonksiyon deklarasyonları ise tüm gövdesiyle birlikte belleğe yazılır, bu nedenle dosyanın en üstünde bile çağrılabilirler. Fonksiyon ifadeleri (var sayHi = function(){}) ise sadece değişken kabı olarak hoisting'e uğrar, atanan fonksiyon değeri değil — bu da erken çağrıldığında TypeError'a yol açar. let ve const ise hoisting'e uğrar ama undefined yerine 'Temporal Dead Zone' adı verilen başlatılmamış bir durumda tutulur; bu bölgede erişim ReferenceError fırlatır.

Yazı ayrıca Execution Context ve Call Stack kavramlarını da ele alarak V8, SpiderMonkey gibi motorların kodu nasıl işlediğini somut bir örnekle gösteriyor. Mühendisler için önemi şu: hoisting'i gerçek mekanizmasıyla anlamak, TDZ hatalarını, undefined sürprizlerini ve fonksiyon ifadesi tuzaklarını debug ederken zaman kazandırır; ayrıca kod incelemelerinde var/let/const seçimini daha bilinçli yapmayı sağlar.