@thefourtheye benar dalam mengatakan bahwa variabel-variabel ini tidak dapat diakses sebelum dideklarasikan. Namun, ini sedikit lebih rumit dari itu.
Apakah variabel dideklarasikan dengan let
atau const
tidak 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
/ class
deklarasi adalah inisialisasi .
Yang pertama diinisialisasi dengan undefined
atau fungsi (generator) tepat ketika mengikat dibuat di bagian atas ruang lingkup. Namun variabel yang dinyatakan secara leksikal tetap tidak diinisialisasi . Ini berarti bahwa ReferenceError
pengecualian dilemparkan ketika Anda mencoba mengaksesnya. Ini hanya akan diinisialisasi ketika pernyataan let
/ const
/ class
dievaluasi, 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 undefined
like 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 let
dan const
dalam hal ini?
Tidak, mereka bekerja sama sejauh mengangkat dianggap. Satu-satunya perbedaan di antara mereka adalah bahwa const
semut harus dan hanya dapat ditugaskan di bagian initialiser dari deklarasi ( const one = 1;
, baik const one;
dan kemudian penugasan kembali seperti one = 2
tidak valid).
1: var
deklarasi 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.