Zamansal ölü bölge nedir?


150

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?


6
ES6'da izin veya const ile bildirilen değişkenler olası yineleniyor mu? - soru TDZ'ye odaklanmasa da, cevaplar temelde aynıdır
Bergi

Yanıtlar:


201

letve constiki geniş farkı vardır var:

  1. Onlar blok kapsamlıdır .
  2. 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 .



@zeroflagL iyi bağlantı, teşekkürler. Ayrıca şöyle diyor: "foo bildirilmemiş, başlatılmamış", dilin yukarıdaki cevapta açıklığa kavuşturmak / düzeltmek için yardımcı olacağını söylüyor. 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.
AJP

2
Bence bu harika bir gönderi! Ancak, 'izin' kaldırmaya maruz kalma izlenimi altındaydım? Bunu Mozilla belgelerinde buldum: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Bir curmudgeon olmaya çalışmıyorum, sadece merak ettim ve açıklığa açıldım.
17'de

1
@jeows MDN sayfası hala kaldırılmadıklarını söylüyor. Söylediklerinizden gerçekten eminseniz, bunu düzenlemeye çalışmalısınız. Sanırım bu konuda bir soru yayınlamalıyım.
doubleOrt

1
@ IMO, ya kaldırıldıklarını söyleyebilir, ancak TDZ nedeniyle beyanlarına ulaşılmadan erişilemezler ya da kaldırılmadıklarını söyleyebilirsiniz, ancak TDZ kendilerine herhangi bir referansın hata atmasına neden olacaktır. Pratik olarak, her iki ifade de eşit derecede doğrudur. Dışında, bence, "kaldırma" terimini soyut anlamda kullanıyorsunuz, "kaldırma = motor her değişkenin varlığından haberdar olduğunda". Bu yüzden mi? Ayrıca, teknik özellikler bu konuda ne diyor?
doubleOrt

7

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.
  • iken let, constbunları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


0

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;

Konsol günlük ikinci örnekte "NaN" (eklenmesinin sonucu üreten undefinedve 5). Declaratation ait var açekiliyor, inifialisation kodu settng a5'e değildir.
traktor53

evet, doğru, a herhangi bir başlatma olmadan kaldırılır. Yani bir tanımsız olacak.
niranjan harpale

Alıntılanan ilk örnek doğru değil, lütfen düzeltin veya kaldırın.
Spidi'nin Web
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.