Saya pernah mendengar bahwa mengakses let
dan const
nilai - nilai sebelum diinisialisasi dapat menyebabkan ReferenceError
karena sesuatu yang disebut zona mati temporal .
Apa zona mati temporal, bagaimana hubungannya dengan ruang lingkup dan mengangkat, dan dalam situasi apa itu ditemui?
javascript
ecmascript-6
const
let
joews
sumber
sumber
Jawaban:
let
danconst
memiliki dua perbedaan besar darivar
:var
sebelum dinyatakan memiliki hasilnyaundefined
; mengakseslet
atauconst
sebelum dinyatakan melemparReferenceError
:Tampaknya dari contoh-contoh ini bahwa
let
deklarasi (danconst
, yang bekerja dengan cara yang sama) mungkin tidak diangkat , karenaaLet
tampaknya tidak ada sebelum diberi nilai.Itu tidak terjadi, namun-
let
danconst
yang mengangkat (sepertivar
,class
danfunction
), tetapi ada periode antara memasuki ruang lingkup dan dinyatakan mana mereka tidak dapat diakses. Periode ini adalah zona mati temporal (TDZ) .TDZ berakhir ketika
aLet
sedang dinyatakan , daripada ditugaskan :Contoh ini menunjukkan yang
let
diangkat:Kredit: Zona Mati Temporal (TDZ) demistifikasi
Mengakses
x
dalam lingkup dalam masih menyebabkan aReferenceError
. Jikalet
tidak diangkat, itu akan masukouter value
.TDZ adalah hal yang baik karena membantu menyoroti bug — mengakses nilai sebelum dinyatakan jarang disengaja.
TDZ juga berlaku untuk argumen fungsi default. Argumen dievaluasi dari kiri ke kanan, dan setiap argumen ada di TDZ sampai ditetapkan:
TDZ tidak diaktifkan secara default di babel.js transpiler. Aktifkan mode "kepatuhan tinggi" untuk menggunakannya dalam REPL . Berikan
es6.spec.blockScoping
bendera untuk menggunakannya dengan CLI atau sebagai perpustakaan.Rekomendasi bacaan lebih lanjut: TDZ demistified dan ES6 Let, Const dan "Temporal Dead Zone" (TDZ) di Depth .
sumber
let foo
dalam sebuah blok menyebabkannya diangkat dan dideklarasikan di bagian atas blok itu. Garislet foo
penyebabnya diinisialisasi. Danfoo = xyz
menyebabkannya diberi nilai.Mengangkat:
let
,const
,var
semua proses mengangkat get.(Apa artinya mereka naik ke atas dan menyatakan di bagian atas lingkup.)
Inisialisasi:
var
pergi juga melalui proses awal, dan dapatkan nilai awalundefined
.let
,const
tidak ikut membuang proses awal, sehingga nilainya masih tidak dapat diakses, meskipun sudah dinyatakan. whats menempatkan merekatemporal dead zone
Jadi singkatnya:
sumber
Dalam kasus variabel let dan const, Pada dasarnya, Zona Mati Temporal adalah zona
"sebelum variabel Anda dideklarasikan",
yaitu di mana Anda tidak dapat mengakses nilai variabel-variabel ini, itu akan menimbulkan kesalahan.
ex.
kode di atas memberikan kesalahan
kode yang sama tidak akan memberikan kesalahan ketika kita menggunakan var untuk variabel 'a',
ex.
sumber
undefined
dan5
). The declaratation darivar a
yang mengangkat, kode inifialisation setelan telaha
sampai 5 tidak.