let
dan const
memiliki dua perbedaan besar dari var
:
- Mereka diblokir .
- Mengakses
var
sebelum dinyatakan memiliki hasilnya undefined
; mengakses let
atau const
sebelum dinyatakan melempar ReferenceError
:
console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;
Tampaknya dari contoh-contoh ini bahwa let
deklarasi (dan const
, yang bekerja dengan cara yang sama) mungkin tidak diangkat , karena aLet
tampaknya tidak ada sebelum diberi nilai.
Itu tidak terjadi, namun- let
dan const
yang mengangkat (seperti var
, class
dan function
), 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 :
//console.log(aLet) // would throw ReferenceError
let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10
Contoh ini menunjukkan yang let
diangkat:
let x = 'outer value';
(function() {
// start TDZ for x
console.log(x);
let x = 'inner value'; // declaration ends TDZ for x
}());
Kredit: Zona Mati Temporal (TDZ) demistifikasi
Mengakses x
dalam lingkup dalam masih menyebabkan a ReferenceError
. Jika let
tidak diangkat, itu akan masuk outer 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:
// 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 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 .