@thefourtheye benar dalam mengatakan bahwa variabel-variabel ini tidak dapat diakses sebelum dideklarasikan. Namun, ini sedikit lebih rumit dari itu.
Apakah variabel dideklarasikan dengan letatau consttidak diangkat? Apa yang sebenarnya terjadi di sini?
Semua deklarasi ( var, let, const, function, function*, class) yang "mengangkat" dalam JavaScript. Ini berarti bahwa jika nama dideklarasikan dalam lingkup, dalam lingkup itu pengidentifikasi akan selalu referensi variabel tertentu:
x = "global";
// function scope:
(function() {
x; // not "global"
var/let/… x;
}());
// block scope (not for `var`s):
{
x; // not "global"
let/const/… x;
}
Ini berlaku untuk fungsi dan blok cakupan 1 .
Perbedaan antara var/ function/ function*deklarasi dan let/ const/ classdeklarasi adalah inisialisasi .
Yang pertama diinisialisasi dengan undefinedatau fungsi (generator) tepat ketika mengikat dibuat di bagian atas ruang lingkup. Namun variabel yang dinyatakan secara leksikal tetap tidak diinisialisasi . Ini berarti bahwa ReferenceErrorpengecualian dilemparkan ketika Anda mencoba mengaksesnya. Ini hanya akan diinisialisasi ketika pernyataan let/ const/ classdievaluasi, semuanya sebelum (di atas) yang disebut zona mati sementara .
x = y = "global";
(function() {
x; // undefined
y; // Reference error: y is not defined
var x = "local";
let y = "local";
}());
Perhatikan bahwa let y;pernyataan akan menginisialisasi variabel dengan undefinedlike let y = undefined;.
The sementara zona mati bukanlah lokasi sintaksis, melainkan waktu antara variabel (lingkup) penciptaan dan inisialisasi. Itu bukan kesalahan untuk referensi variabel dalam kode di atas pernyataan selama kode itu tidak dieksekusi (misalnya fungsi tubuh atau kode mati), dan itu akan membuang pengecualian jika Anda mengakses variabel sebelum inisialisasi bahkan jika mengakses kode di bawah deklarasi (mis. dalam deklarasi fungsi yang diangkat yang disebut terlalu dini).
Apakah ada perbedaan antara letdan constdalam hal ini?
Tidak, mereka bekerja sama sejauh mengangkat dianggap. Satu-satunya perbedaan di antara mereka adalah bahwa constsemut harus dan hanya dapat ditugaskan di bagian initialiser dari deklarasi ( const one = 1;, baik const one;dan kemudian penugasan kembali seperti one = 2tidak valid).
1: vardeklarasi masih bekerja hanya pada level fungsi, tentu saja
let foo = () => bar; let bar = 'bar'; foo();menggambarkan semua deklarasi adalah efek mengangkat lebih baik, karena tidak jelas karena zona mati sementara.