Başlatmadan önce erişmenin letve constdeğ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 letve constdeğ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:
letve constiki geniş farkı vardır var:
varSonuç olarak bildirilmeden önce bir sonuca erişmek undefined; a letveya constilan 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, letbeyanların (ve constaynı ş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 letve const edilmektedir çekilir (gibi var, classve 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 aLetolduğ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.blockScopingCLI 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 foobir blokta blokun üst kısmında kaldırılmasına ve beyan edilmesine neden olur. Bunun let foonedenleri başlatılır. Ve foo = xyzbuna bir değer atanmasına neden olur.
Kaldırma:
let , const, varbütün olsun çekilir süreçtir.
(ne kadar yukarıda oldukları ve kapsamın üstünde beyan ettikleri anlamına gelir.)
Başlatma:
varayrıca ilk işlemden geçer ve ilk değerini alır undefined.let, constbunların değerleri hala erişilemez yüzden zaten ilan rağmen, ilk işlemini atmak gitmedi. onları ne koydutemporal dead zoneKı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;
undefinedve 5). Declaratation ait var açekiliyor, inifialisation kodu settng a5'e değildir.