Fenomena ini dikenal sebagai: JavaScript Variable Hoisting .
Anda tidak akan pernah mengakses variabel global dalam fungsi Anda; Anda hanya pernah mengakses value
variabel lokal .
Kode Anda setara dengan berikut ini:
var value = 10;
function test() {
var value;
console.log(value);
value = 20;
console.log(value);
}
test();
Masih terkejut Anda mendapatkannya undefined
?
Penjelasan:
Ini adalah sesuatu yang setiap programmer JavaScript akan temui cepat atau lambat. Sederhananya, variabel apa pun yang Anda nyatakan selalu diangkat ke atas penutupan lokal Anda. Jadi, meskipun Anda mendeklarasikan variabel Anda setelah console.log
panggilan pertama , itu masih dianggap seolah-olah Anda telah mendeklarasikannya sebelumnya.
Namun, hanya bagian deklarasi yang diangkat; tugas, di sisi lain, tidak.
Jadi, ketika Anda pertama kali memanggil console.log(value)
, Anda mereferensikan variabel yang dideklarasikan secara lokal, yang belum ada yang ditugaskan padanya; karenanya undefined
.
Berikut contoh lainnya :
var test = 'start';
function end() {
test = 'end';
var test = 'local';
}
end();
alert(test);
Menurut Anda apa yang akan mengingatkan ini? Tidak, jangan hanya membaca, pikirkanlah. Apa nilainya test
?
Jika Anda mengatakan sesuatu selain start
, Anda salah. Kode di atas sama dengan ini:
var test = 'start';
function end() {
var test;
test = 'end';
test = 'local';
}
end();
alert(test);
sehingga variabel global tidak pernah terpengaruh.
Seperti yang Anda lihat, di mana pun Anda meletakkan deklarasi variabel, deklarasi itu selalu diangkat ke atas penutupan lokal Anda.
Catatan samping:
Ini juga berlaku untuk fungsi.
Pertimbangkan bagian kode ini :
test("Won't work!");
test = function(text) { alert(text); }
yang akan memberi Anda kesalahan referensi:
ReferenceError Tidak Tertangkap: tes tidak ditentukan
Ini membuang banyak pengembang, karena potongan kode ini berfungsi dengan baik:
test("Works!");
function test(text) { alert(text); }
Alasannya, seperti yang dinyatakan, karena bagian penugasan tidak diangkat. Jadi pada contoh pertama, ketika test("Won't work!")
dijalankan, test
variabel telah dideklarasikan, tetapi belum memiliki fungsi yang ditugaskan padanya.
Dalam contoh kedua, kami tidak menggunakan tugas variabel. Sebaliknya, kita menggunakan sintaks deklarasi fungsi yang tepat, yang tidak mendapatkan fungsi benar-benar mengangkat.
Ben Cherry telah menulis artikel yang sangat bagus tentang ini, berjudul Scoping and Hoisting JavaScript .
Membacanya. Ini akan memberi Anda gambaran keseluruhan dengan detail penuh.