Başlatmadan önce erişmenin let
ve const
değerlerin geçici ölü bölgeReferenceError
denilen bir şeyden kaynaklanabileceğini duydum .
Zamansal ölü bölge nedir, kapsam ve kaldırma ile nasıl ilişkilidir ve hangi durumlarda karşılaşılır?
Başlatmadan önce erişmenin let
ve const
değerlerin geçici ölü bölgeReferenceError
denilen bir şeyden kaynaklanabileceğini duydum .
Zamansal ölü bölge nedir, kapsam ve kaldırma ile nasıl ilişkilidir ve hangi durumlarda karşılaşılır?
Yanıtlar:
let
ve const
iki geniş farkı vardır var
:
var
Sonuç olarak bildirilmeden önce bir sonuca erişmek undefined
; a let
veya const
ilan edilmeden önce erişim atar ReferenceError
:console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;
Bu örneklerden, let
beyanların (ve const
aynı şekilde çalışan) kaldırılmayabileceği anlaşılmaktadır , çünküaLet
bir değer atanmadan önce var gibi görünmez.
Yani, Ancak-durum böyle değildir let
ve const
edilmektedir çekilir (gibi var
, class
ve function
), fakat kapsamını giren ve erişilemez burada beyan edilen arasında bir süresi vardır. Bu dönem zamansal ölü bölgedir (TDZ) .
TGB'nin zaman biter aLet
olduğu beyan yerine atanan :
//console.log(aLet) // would throw ReferenceError
let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10
Bu örnek let
, çekildiğini gösterir :
let x = 'outer value';
(function() {
// start TDZ for x
console.log(x);
let x = 'inner value'; // declaration ends TDZ for x
}());
Kredi bilgileri: Temporal Dead Zone (TDZ) demystified
x
İç kapsamda erişim hala a ReferenceError
. Eğer let
çekili değildi, bu giriş yapacaktır outer value
.
TDZ iyi bir şeydir, çünkü hataları vurgulamaya yardımcı olur - bildirilmeden önce bir değere erişmek nadiren kasıtlıdır.
TDZ ayrıca varsayılan işlev bağımsız değişkenleri için de geçerlidir. Bağımsız değişkenler soldan sağa değerlendirilir ve her bağımsız değişken atanana kadar TDZ'de bulunur:
// b is in TDZ until its value is assigned
function testDefaults(a=b, b) { }
testDefaults(undefined, 1); // throws ReferenceError because the evaluation of a reads b before it has been evaluated.
TDZ, babel.js aktarıcısında varsayılan olarak etkin değildir . Kullanmak için "yüksek uyumluluk" modunu açın repl . Tedarik es6.spec.blockScoping
CLI ile veya kütüphane olarak kullanmak için bayrağı.
Önerilen ilave okumalar: TDZ demystified ve ES6 Let, Const ve “Temporal Dead Zone” (TDZ) in Depth .
let foo
bir blokta blokun üst kısmında kaldırılmasına ve beyan edilmesine neden olur. Bunun let foo
nedenleri başlatılır. Ve foo = xyz
buna bir değer atanmasına neden olur.
Kaldırma:
let
, const
, var
bütün olsun çekilir süreçtir.
(ne kadar yukarıda oldukları ve kapsamın üstünde beyan ettikleri anlamına gelir.)
Başlatma:
var
ayrıca ilk işlemden geçer ve ilk değerini alır undefined
.let
, const
bunların değerleri hala erişilemez yüzden zaten ilan rağmen, ilk işlemini atmak gitmedi. onları ne koydutemporal dead zone
Kısacası:
Kaldırma işlemi:
var
,let
,const
Başlatma işlemi:var
Let ve cons değişkenlerinde, temel olarak, geçici ölü bölge bir bölgedir
"değişkeniniz bildirilmeden önce",
yani, bu değişkenlerin değerine erişemediğinizde hata verir.
ex.
let sum = a + 5; //---------
//some other code // | ------> this is TDZ for variable a
// |
console.log(sum) //---------
let a = 5;
yukarıdaki kod bir hata veriyor
'a' değişkeni için var kullandığımızda aynı kod hata vermeyecektir,
ex.
var sum = a;
console.log(sum) //prints undefined
var a = 5;
undefined
ve 5
). Declaratation ait var a
çekiliyor, inifialisation kodu settng a
5'e değildir.