Czym jest martwa strefa czasowa?

Słyszałem, że dostęp do wartości let i const przed ich zadeklarowaniem może spowodować ReferenceError z powodu czegoś, co nazywa się temporal dead zone.

Czym jest martwa strefa czasowa, jak odnosi się do zasięgu i podnoszenia i w jakich sytuacjach się napotyka?

Author: Michał Perłakowski, 2015-10-18

1 answers

let i const mają dwie zasadnicze różnice od var:

  1. blokami .
  2. dostęp do var przed jego zadeklarowaniem ma wynik undefined; dostęp do let lub const przed jego zadeklarowaniem rzuca ReferenceError:

console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;

Z tych przykładów wynika, że let deklaracje (i const, które działają w ten sam sposób) nie mogą być podniesione , ponieważ aLet nie wydaje się istnieć przed przypisaniem wartość.

Tak jednak nie jest-let i const podnoszone (jak var, class i function), ale jest okres między wejściem w zakres a ogłoszeniem, w którym nie można uzyskać do nich dostępu. ten okres to czasowa martwa strefa (TDZ) .

TDZ kończy się, gdy aLet jest zadeklarowane , a nie przypisane :

//console.log(aLet)  // would throw ReferenceError

let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10

Ten przykład pokazuje, że let jest

let x = 'outer value';
(function() {
  // start TDZ for x
  console.log(x);
  let x = 'inner value'; // declaration ends TDZ for x
}());

Kredyt: Temporal Dead Zone (TDZ) demystified

Dostęp x w wewnętrznym zakresie nadal powoduje ReferenceError. Jeśli let nie zostały podniesione, to log outer value.

TDZ jest dobrą rzeczą, ponieważ pomaga wyróżniać błędy-dostęp do wartości przed jej zadeklarowaniem jest rzadko celowy.

TDZ stosuje się również do domyślnych argumentów funkcji. Argumenty są oceniane od lewej do prawej, a każdy argument jest w TDZ do momentu przypisania:

// 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 nie jest domyślnie włączone w babel.js transpiler. Włącz tryb "wysoka zgodność", aby używać go w REPL . Podaj flagę es6.spec.blockScoping, aby używać jej z CLI lub jako biblioteki.

Zalecane dalsze czytanie: TDZ demystified i ES6 Let, Const i" Temporal Dead Zone " (TDZ) w głębi .

 137
Author: joews,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-09 15:08:13