@thefourtheye, bu değişkenlere bildirilmeden önce erişilemeyeceğini söylerken doğrudur . Ancak, bundan biraz daha karmaşık.
Değişkenler beyan edilmiş letveya constkaldırılmamış mı? Burada gerçekten neler oluyor?
Tüm beyanlar ( var, let, const, function, function*, class) "hoisted" olan JavaScript. Bu, bir isim bir kapsamda bildirilirse, bu kapsamda tanımlayıcının her zaman bu belirli değişkene başvuracağı anlamına gelir:
x = "global";
// function scope:
(function() {
x; // not "global"
var/let/… x;
}());
// block scope (not for `var`s):
{
x; // not "global"
let/const/… x;
}
Bu hem fonksiyon hem de blok kapsamları 1 için geçerlidir .
var/ function/ function*Bildirimleri ve let/ const/ classbildirimleri arasındaki fark başlatmadır . Ciltleme, kapsamın en üstünde oluşturulduğunda,
öncekiyle undefinedveya (jeneratör) işleviyle hemen başlatılır . Ancak, sözlü olarak bildirilen değişkenler başlatılmamış olarak kalır . Bu ReferenceError, erişmeye çalıştığınızda bir istisna atıldığı anlamına gelir . Yalnızca let/ const/ classifadesi değerlendirildiğinde, geçici ölü bölge olarak adlandırılan önceki (yukarıda) her şey başlatılır .
x = y = "global";
(function() {
x; // undefined
y; // Reference error: y is not defined
var x = "local";
let y = "local";
}());
Bir let y;deyimin değişkeni undefinedbenzer şekilde başlattığına dikkat edin let y = undefined;.
Zamansal ölü bölge bir sentaks yer değil fakat daha çok zaman değişkeni (kapsam) oluşturulması ve başlatma arasında. Bu kod yürütülmediği sürece (örn. Bir işlev gövdesi veya yalnızca ölü kod), koddaki değişkene başvurmak bir hata değildir ve erişime rağmen bile başlatma işleminden önce değişkene erişirseniz bir istisna atar kodu bildirimin altındadır (örneğin, çok erken çağrılan bir kaldırma işlevi bildiriminde).
Bu konuda letve constbu konuda herhangi bir fark var mı ?
Hayır, kaldırma işlemi göz önüne alındığında aynı şekilde çalışırlar. Aralarındaki tek fark, bir constkarıncanın beyanın başlatıcı kısmında atanması ve atanabilmesidir ( const one = 1;hem const one;ve daha sonra yeniden atamalar one = 2geçersizdir).
1: varbildirimler elbette sadece işlev düzeyinde çalışıyor
let foo = () => bar; let bar = 'bar'; foo();göstermektedir tüm beyanlar askıya alır o zamansal ölü bölge nedeniyle açık değildir, çünkü daha iyi bir etki.