@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ş let
veya const
kaldı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
/ class
bildirimleri arasındaki fark başlatmadır . Ciltleme, kapsamın en üstünde oluşturulduğunda,
öncekiyle undefined
veya (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
/ class
ifadesi 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 undefined
benzer ş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 let
ve const
bu 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 const
karı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 = 2
geçersizdir).
1: var
bildirimler 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.