Untuk ruang lingkup variabel, bahasa seperti C, Java mengadopsi metode "cakupan blok". Sebaliknya, JavaScript mengadopsi metode "lingkup fungsi" - ruang lingkup variabel ditentukan hanya oleh fungsi di mana ia berada dan tidak ada hubungannya dengan blok logis seperti jika dan untuk. Misalnya, contoh berikut menunjukkan perilaku dalam JavaScript yang berbeda dari bahasa seperti C dan Java:
Salinan kode adalah sebagai berikut:
fungsi(){
var s = 42; // s terlihat di seluruh fungsi
if (s> 3) {
var x = "test"; // x terlihat di seluruh fungsi
untuk (var i = 0; i <10; i ++) {
console.log (i);
}
console.log (i); // i terlihat di seluruh fungsi
}
console.log (i);
console.log (x);
}
Dalam bahasa "Block Scope" seperti C dan Java, setelah blok logis seperti Pernyataan IF dan untuk pernyataan selesai, variabel yang didefinisikan di dalam blok logis ini akan dihancurkan. Javascript berbeda. Selama suatu variabel didefinisikan dalam suatu fungsi, semua kode di seluruh fungsi dapat mengakses variabel, bahkan jika kode sebelum definisi variabel:
Salinan kode adalah sebagai berikut:
fungsi(){
console.log (a); // tidak ditentukan
var a = "tes";
console.log (a); // tes
}
Dalam contoh di atas, jika a tidak pernah didefinisikan dalam fungsi, console.log (a) akan melempar referensiError. Ketika A didefinisikan dalam fungsi, bahkan jika definisi ini adalah setelah pernyataan panggilan variabel A, panggilan ke A adalah operasi hukum (jika definisi variabel terjadi setelah pernyataan panggilan, nilai variabel dalam pernyataan panggilan tidak terdefinisi). Bahkan, semua variabel yang ditentukan dengan kata kunci VAR dalam fungsi akan diangkat ke awal fungsi (operasi penugasan tetap pada garis yang ditentukan oleh var), yang disebut pengangkatan dalam javascript. Misalnya, kode di atas setara dengan:
Salinan kode adalah sebagai berikut:
fungsi(){
var a;
console.log (a); // tidak ditentukan
a = "tes";
console.log (a); // tes
}
Rantai ruang lingkup variabel
Menghubungi penyimpanan variabel dalam JavaScript dapat memberikan pemahaman yang baik tentang "ruang lingkup fungsi" dan mengangkat JS. Karena variabel disimpan pada objek global atau objek panggilan fungsi, ketika mendefinisikan variabel dalam suatu fungsi, di mana pun variabel didefinisikan dalam panggilan fungsi, properti dengan nama yang sama seperti variabel ini pasti akan muncul dalam objek panggilan fungsi yang digunakan oleh panggilan fungsi ini. Ini memungkinkan variabel untuk diakses di mana saja dalam fungsi.
Ketika datang ke panggilan fungsi, ada konsep lain yang lebih menarik dalam JavaScript: rantai lingkup variabel - karena variabel disimpan pada objek global atau objek panggilan fungsi, saat mengakses variabel, Anda bisa mendapatkan nilai dari banyak objek. Kode berikut adalah contoh:
Salinan kode adalah sebagai berikut:
var x = "tes";
fungsi(){
// fungsi level-1
var x = "temp";
fungsi(){
// Fungsi Level-2
var x = "nyata";
// Cobalah untuk mengakses X di sini. X akan menjadi "nyata".
}
}
Di dalam fungsi Level -2 dalam kode di atas, ketika mencoba mengakses variabel X, program dapat mencari nilai atribut yang sesuai dari 3 objek: Objek panggilan fungsi yang digunakan untuk memanggil fungsi Level 2, fungsi panggilan panggilan yang digunakan untuk memanggil fungsi Level 1, dan objek global - sesuai dengan hubungan yang ditentukan oleh fungsi, JavaScript akan menghasilkan rantai objek yang terdiri dari objek global dan fungsi global. Saat mengakses variabel, program akan mulai mencari dari objek yang paling dekat dengan pernyataan akses. Jika tidak ada pencarian yang ditemukan, itu akan terus mencari di objek di level sebelumnya di rantai objek sampai objek global.
Karena rantai objek ini terkait dengan ruang lingkup variabel, ia juga disebut "rantai lingkup".
Jika Anda perlu untuk sementara mengubah rantai lingkup dan memasukkan objek ke ujung depan rantai lingkup (sebagai objek fungsi yang diakses terlebih dahulu), Anda dapat menggunakan pernyataan dengan:
Salinan kode adalah sebagai berikut:
dengan (o) {
// Kode Gunakan properti objek o.
}
Namun, dalam mode JavaScript yang ketat, dengan pernyataan dinonaktifkan; Bahkan dalam mode non-ketat, dengan pernyataan tidak dianjurkan.