Bu fenomen, JavaScript Değişken Kaldırma olarak bilinir .
Fonksiyonunuzdaki global değişkene hiçbir noktada erişmiyorsunuz; sadece yerel value
değişkene erişiyorsunuz .
Kodunuz aşağıdakine eşdeğerdir:
var value = 10;
function test() {
var value;
console.log(value);
value = 20;
console.log(value);
}
test();
Hala şaşırdığına şaşırdın mı undefined
?
Açıklama:
Bu, her JavaScript programcısının er ya da geç karşılaştığı bir şeydir. Basitçe ifade etmek gerekirse, beyan ettiğiniz değişkenler her zaman yerel kapanışınızın en üstüne kaldırılır . Dolayısıyla, değişkeninizi ilk console.log
aramadan sonra bildirmiş olsanız bile , yine de daha önce bildirmişsiniz gibi kabul edilir.
Ancak sadece beyanname kısmı kaldırılıyor; ödev ise değil.
Yani, ilk aradığınızda console.log(value)
, henüz kendisine atanmış hiçbir şey olmayan yerel olarak bildirilmiş değişkeninize başvuruyordunuz; dolayısıyla undefined
.
İşte başka bir örnek :
var test = 'start';
function end() {
test = 'end';
var test = 'local';
}
end();
alert(test);
Bunun neyi uyaracağını düşünüyorsun? Hayır, sadece okumaya devam etme, bir düşün. Değeri nedir test
?
Dışında bir şey söylediyseniz start
, yanılıyorsunuz. Yukarıdaki kod şuna eşdeğerdir:
var test = 'start';
function end() {
var test;
test = 'end';
test = 'local';
}
end();
alert(test);
böylece global değişken asla etkilenmez.
Gördüğünüz gibi, değişken bildiriminizi nereye koyarsanız koyun, her zaman yerel kapanışınızın en üstüne kaldırılır .
Kenar notu:
Bu aynı zamanda işlevler için de geçerlidir.
Şu kod parçasını düşünün :
test("Won't work!");
test = function(text) { alert(text); }
bu size bir referans hatası verecektir:
Yakalanmamış Referans Hatası: test tanımlanmadı
Bu kod parçası iyi çalıştığı için pek çok geliştiriciyi kaçırır:
test("Works!");
function test(text) { alert(text); }
Belirtildiği gibi atama parçası olduğu için bunun nedeni, olduğu değil göndere çekildi. Yani ilk örnekte ne zaman test("Won't work!")
çalıştırıldı,test
değişken zaten bildirilmiştir, ancak henüz kendisine atanan fonksiyona sahip değildir.
İkinci örnekte, değişken atama kullanmıyoruz. Aksine, biz doğru fonksiyon beyanı sözdizimi, kullandığınız yapar tamamen göndere çekildi fonksiyonu olsun.
Ben Cherry , bununla ilgili olarak uygun şekilde JavaScript Kapsam Belirleme ve Kaldırma başlıklı mükemmel bir makale yazdı .
Oku onu. Size tüm resmi tüm ayrıntılarıyla verecektir.