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?
1 answers
let
i const
mają dwie zasadnicze różnice od var
:
- sąblokami .
- dostęp do
var
przed jego zadeklarowaniem ma wynikundefined
; dostęp dolet
lubconst
przed jego zadeklarowaniem rzucaReferenceError
:
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
są 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 .
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