letdan constmemiliki dua perbedaan besar dari var:
- Mereka diblokir .
- Mengakses
varsebelum dinyatakan memiliki hasilnya undefined; mengakses letatau constsebelum 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 letdeklarasi (dan const, yang bekerja dengan cara yang sama) mungkin tidak diangkat , karena aLettampaknya tidak ada sebelum diberi nilai.
Itu tidak terjadi, namun- letdan const yang mengangkat (seperti var, classdan 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 aLetsedang 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 letdiangkat:
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 xdalam lingkup dalam masih menyebabkan a ReferenceError. Jika lettidak 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.blockScopingbendera untuk menggunakannya dengan CLI atau sebagai perpustakaan.
Rekomendasi bacaan lebih lanjut: TDZ demistified dan ES6 Let, Const dan "Temporal Dead Zone" (TDZ) di Depth .