Perbedaannya terletak pada ruang lingkupnya variabel yang dideklarasikan dengan masing-masing.
Dalam praktiknya, ada sejumlah konsekuensi berguna dari perbedaan ruang lingkup:
let
variabel hanya terlihat di blok terlampir terdekat ( { ... }
).
let
variabel hanya dapat digunakan dalam baris kode yang terjadi setelah variabel dideklarasikan (meskipun mereka dinaikkan !).
let
variabel tidak boleh dideklarasikan ulang oleh variabel berikutnya var
atau let
.
let
Variabel global tidak ditambahkan ke window
objek global .
let
variabel mudah digunakan dengan penutupan (mereka tidak menyebabkan kondisi balapan ).
Pembatasan yang diberlakukan dengan let
mengurangi 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, let
variabel cenderung menyebabkan masalah ketika digunakan dalam program besar atau ketika kerangka kerja yang dikembangkan secara independen dikombinasikan dengan cara-cara baru dan tidak terduga.
var
mungkin 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 var
untuk 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 x
terjadi 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 var
karya.
2. Tidak ada gunanya sebelum deklarasi:
Blok kode ini akan melempar ReferenceError
sebelum kode dapat dijalankan karena x
digunakan 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 var
mem - parsing dan menjalankan tanpa melemparkan pengecualian.
3. Tidak ada deklarasi ulang:
Kode berikut menunjukkan bahwa variabel yang dideklarasikan dengan let
mungkin 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 var
tidak bekerja dengan baik dengan penutupan di dalam loop. Berikut ini adalah loop sederhana yang menampilkan urutan nilai yang dimiliki variabel i
pada 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 i
sebagai 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
let
termasuk dalam draft edisi ke - 6 dan kemungkinan besar akan berada dalam spesifikasi akhir.