Słyszałem, że uzyskiwanie dostępu let
i const
wartości przed ich zainicjowaniem może spowodować ReferenceError
coś, co nazywa się czasową martwą strefą .
Co to jest czasowa martwa strefa, jaki ma związek z zasięgiem i podnoszeniem oraz w jakich sytuacjach występuje?
javascript
ecmascript-6
const
let
joews
źródło
źródło
Odpowiedzi:
let
iconst
mają dwie duże różnice w stosunku dovar
:var
przed jego zadeklarowaniem daje wynikundefined
; dostęp dolet
lubconst
przed deklaracją rzucaReferenceError
:Z tych przykładów wynika, że
let
deklaracje (iconst
, 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
iconst
są wydobywanych (jakvar
,class
ifunction
), 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 :Ten przykład pokazuje, że
let
jest podnoszony:Kredyt: Temporal Dead Zone (TDZ) bez tajemnic
Dostęp
x
do zakresu wewnętrznego nadal powodujeReferenceError
. Gdybylet
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:
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 .
źródło
let foo
w bloku powoduje jego podniesienie i zadeklarowanie na górze tego bloku. Linia oflet foo
powoduje jej zainicjowanie. Ifoo = xyz
powoduje przypisanie mu wartości.Wyciągowych:
let
,const
,var
to wszyscy się podnieśli proces.(co oznacza, że idą wyżej i deklarują się na szczycie zakresu.)
Inicjalizacja:
var
przejść również przez początkowy proces i uzyskać wartość początkowąundefined
.let
,const
nie rzucił początkowego procesu, więc ich wartości są nadal niedostępne, chociaż już zadeklarowali. co je włożyłotemporal dead zone
Więc w skrócie:
źródło
W przypadku zmiennych let i const, Zasadniczo, czasowa martwa strefa jest strefą
"przed zadeklarowaniem zmiennej",
tzn. jeśli nie możesz uzyskać dostępu do wartości tych zmiennych, spowoduje to błąd.
dawny.
powyższy kod daje błąd
ten sam kod nie spowoduje błędu, gdy użyjemy var dla zmiennej „a”,
dawny.
źródło
undefined
i5
). Declaratation odvar a
jest podciągnięta The settng kod inifialisationa
do 5 nie jest.