Javascript'te Kaldırma işleminin perde arkası

Apr 01 2023
JavaScript ile ilgili en sık sorulan mülakat sorularından biri "Yükseltme nedir?" Tipik olarak, bu sorunun yanıtı, kaldırma işleminin JavaScript'te değişkenlerin ve işlevlerin resmi olarak bildirilmeden önce kullanılmasına izin veren bir davranış olduğunu belirtmeyi içerir. Ancak, JavaScript'te yükseltmenin altında yatan mekanizma nedir ve neden değişkenlerin ve işlevlerin bildirilmeden önce kullanılmasına izin verir? Ayrıca, kaldırma neden diğer programlama dillerinde değil de JavaScript'e özgüdür? Bu kavramı daha iyi anlamak için, kodun derleme ve yürütme aşamalarında neler olduğuna daha yakından bakalım.

JavaScript ile ilgili en sık sorulan mülakat sorularından biri “ Kaldırma nedir? ”

Tipik olarak, bu sorunun yanıtı, kaldırma işleminin JavaScript'te değişkenlerin ve işlevlerin resmi olarak bildirilmeden önce kullanılmasına izin veren bir davranış olduğunu belirtmeyi içerir.

Ancak, JavaScript'te yükseltmenin altında yatan mekanizma nedir ve neden değişkenlerin ve işlevlerin bildirilmeden önce kullanılmasına izin verir? Ayrıca, kaldırma neden diğer programlama dillerinde değil de JavaScript'e özgüdür? Bu kavramı daha iyi anlamak için, kodun derleme ve yürütme aşamalarında neler olduğuna daha yakından bakalım.

Unsplash'ta Mohammad Rahmani'nin fotoğrafı

Yürütme Bağlamı

Bir JavaScript dosyasını çalıştırdığınızda, iki ana bölümden oluşan bir Yürütme Bağlamı (EC) oluşturur: bir bellek bloğu ve bir kod bloğu. Bellek bloğu, değişkenleri depolar ve anahtar-değer çiftleri olarak işlev görürken, kod bloğu, bellek tahsisi tamamlandıktan sonra yürütülür. EC'yi anlamak, JavaScript'in nasıl çalıştığını anlamak için çok önemlidir.

Bu küçük kod parçası için EC'yi yazalım.

Bellek ayırma adı verilen Yürütme Bağlamı'nın (EC) ilk aşamasında, EC "a" değişkeni için bellek alanı ayırır ve uygun bir değer elde edene kadar ona "undefined" yer tutucu değerini atar. "Tanımsız"ın, değişkenin bellekte var olduğunu ancak henüz kendisine atanmış bir değeri olmadığını, "tanımlanmamış"ın ise değişkenin hiç bildirilmediğini gösterdiğine dikkat etmek önemlidir.

Ek olarak EC, tüm fonksiyon bloğu kodunu kopyalar ve saklar. Ne zaman yeni bir işlevle karşılaşılsa, JavaScript onu işlemek için yeni bir EC oluşturur.

EC'nin 1. Aşamasından Sonra

Yürütme Bağlamı'nın (EC) ikinci aşamasında kod bloğu yürütülür. 1. satırda “a” değişkeni 10 değeri ile başlatılır. AK, “a” değişkenine 10 değerini atayarak bellek bloğunu günceller ve 9. satıra geçer. 9. satırda “b( )” çağrılır ve EC bunu bellek bloğunda kontrol eder ve yürütür. Daha sonra, EC 10. satıra geçer ve "a" değerini bellek bloğundan alarak konsola yazdırır.

EC'nin 2. Aşamasından Sonra

Şimdi aşağıdaki kod için EC yazmayı deneyelim. Çıktının ne olabileceğini tahmin edebilir misiniz? Ve Resim 2'den ne farkı var?

Resim 1 (sol) ve Resim 2 (sağ)
Resim 1 (sol) ve Resim 2 (sağ) için Çıktı

Sağ taraftaki koda bakıldığında Execution Context (EC) bellek bloğunda “a” değişkenini arar. Ancak, bellek bloğunda böyle bir değişken bildirilmediğinden, EC yürütmeyi durdurur ve bir referans hatası verir. Bu hata, bir değişken veya işlev çağrıldığında veya bunlara başvurulduğu halde bildirilmediğinde veya tanımlanmadığında ortaya çıkar.

JavaScript'in bellek ayırma aşaması ve kod yürütme aşaması olmak üzere iki aşamada yürütülmesi, tam olarak JavaScript'in kaldırma işlemini gerçekleştirebilmesinin nedenidir. Bellek tahsisi aşamasında JavaScript, değişkenler ve işlevler için bellek alanını ayarlar ve kod yürütme aşamasında uygun şekilde bildirilene kadar bunlara "tanımsız" bir yer tutucu değeri atar.