let
i const
mają dwie duże różnice w stosunku do var
:
- Mają zasięg blokowy .
- Uzyskanie dostępu do a
var
przed jego zadeklarowaniem daje wynik undefined
; dostęp do let
lub const
przed deklaracją 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ć podnoszone , ponieważ aLet
nie wydaje się istnieć przed przypisaniem jej wartości.
To nie jest przypadek, however- let
i const
są wydobywanych (jak var
, class
i function
), ale nie jest to okres pomiędzy wejściem do zakresu i zadeklarowane w przypadku gdy nie można uzyskać. Ten okres jest czasową martwą strefą (TDZ) .
TDZ kończy się, gdy aLet
zostanie zadeklarowany , a nie przypisany :
//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 podnoszony:
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) bez tajemnic
Dostęp x
do zakresu wewnętrznego nadal powoduje ReferenceError
. Gdyby let
nie był podnoszony, rejestrowałby się outer value
.
TDZ to dobra rzecz, ponieważ pomaga wyróżnić błędy - dostęp do wartości przed jej zadeklarowaniem rzadko jest zamierzony.
TDZ ma również zastosowanie do domyślnych argumentów funkcji. Argumenty są oceniane od lewej do prawej, a każdy argument znajduje się w TDZ, dopóki nie zostanie przypisany:
// 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łączony w transpilerze babel.js. Włącz tryb „wysokiej zgodności”, aby używać go w REPL . Podaj es6.spec.blockScoping
flagę, aby użyć jej z interfejsem wiersza polecenia lub jako biblioteką.
Zalecane dalsze lektury: TDZ zdemistyfikowany i ES6 Let, Const i „Temporal Dead Zone” (TDZ) in Depth .