Perbedaannya terletak pada ruang lingkupnya variabel yang dideklarasikan dengan masing-masing.
Dalam praktiknya, ada sejumlah konsekuensi berguna dari perbedaan ruang lingkup:
letvariabel hanya terlihat di blok terlampir terdekat ( { ... }).
letvariabel hanya dapat digunakan dalam baris kode yang terjadi setelah variabel dideklarasikan (meskipun mereka dinaikkan !).
letvariabel tidak boleh dideklarasikan ulang oleh variabel berikutnya varatau let.
letVariabel global tidak ditambahkan ke windowobjek global .
letvariabel mudah digunakan dengan penutupan (mereka tidak menyebabkan kondisi balapan ).
Pembatasan yang diberlakukan dengan letmengurangi visibilitas variabel dan meningkatkan kemungkinan tabrakan nama yang tidak terduga akan ditemukan lebih awal. Ini membuatnya lebih mudah untuk dilacak dan alasan tentang variabel, termasuk jangkauannya (membantu memulihkan kembali memori yang tidak digunakan).
Akibatnya, letvariabel cenderung menyebabkan masalah ketika digunakan dalam program besar atau ketika kerangka kerja yang dikembangkan secara independen dikombinasikan dengan cara-cara baru dan tidak terduga.
varmungkin masih berguna jika Anda yakin Anda ingin efek ikatan tunggal saat menggunakan penutupan dalam satu lingkaran (# 5) atau untuk mendeklarasikan variabel global yang terlihat secara eksternal dalam kode Anda (# 4). Penggunaan varuntuk ekspor dapat digantikan jikaexport bermigrasi keluar dari ruang transpiler dan ke dalam bahasa inti.
Contohnya
1. Tidak digunakan di luar blok penutup terdekat:
Blok kode ini akan melempar kesalahan referensi karena penggunaan kedua xterjadi di luar blok di mana dinyatakan dengan let:
{
let x = 1;
}
console.log(`x is ${x}`); // ReferenceError during parsing: "x is not defined".
Sebaliknya, contoh yang sama dengan varkarya.
2. Tidak ada gunanya sebelum deklarasi:
Blok kode ini akan melempar ReferenceErrorsebelum kode dapat dijalankan karena xdigunakan sebelum dideklarasikan:
{
x = x + 1; // ReferenceError during parsing: "x is not defined".
let x;
console.log(`x is ${x}`); // Never runs.
}
Sebaliknya, contoh yang sama dengan varmem - parsing dan menjalankan tanpa melemparkan pengecualian.
3. Tidak ada deklarasi ulang:
Kode berikut menunjukkan bahwa variabel yang dideklarasikan dengan letmungkin tidak akan dideklar ulang nanti:
let x = 1;
let x = 2; // SyntaxError: Identifier 'x' has already been declared
4. Global tidak melekat pada window:
var button = "I cause accidents because my name is too common.";
let link = "Though my name is common, I am harder to access from other JS files.";
console.log(link); // OK
console.log(window.link); // undefined (GOOD!)
console.log(window.button); // OK
5. Mudah digunakan dengan penutupan:
Variabel dideklarasikan dengan vartidak bekerja dengan baik dengan penutupan di dalam loop. Berikut ini adalah loop sederhana yang menampilkan urutan nilai yang dimiliki variabel ipada titik waktu yang berbeda:
for (let i = 0; i < 5; i++) {
console.log(`i is ${i}`), 125/*ms*/);
}
Secara khusus, output ini:
i is 0
i is 1
i is 2
i is 3
i is 4
Dalam JavaScript kita sering menggunakan variabel pada waktu yang lebih lama daripada saat mereka dibuat. Ketika kami menunjukkan ini dengan menunda output dengan penutupan diteruskan ke setTimeout:
for (let i = 0; i < 5; i++) {
setTimeout(_ => console.log(`i is ${i}`), 125/*ms*/);
}
... output tetap tidak berubah selama kita tetap dengan let. Sebaliknya, jika kita menggunakan var isebagai gantinya:
for (var i = 0; i < 5; i++) {
setTimeout(_ => console.log(`i is ${i}`), 125/*ms*/);
}
... loop secara tak terduga menampilkan "i is 5" lima kali:
i is 5
i is 5
i is 5
i is 5
i is 5
lettermasuk dalam draft edisi ke - 6 dan kemungkinan besar akan berada dalam spesifikasi akhir.