Kata -kata sebelumnya
Sebagian besar waktu, alasan utama mengapa kami bingung tentang ruang lingkup adalah bahwa kami tidak dapat membedakan apakah pencarian variabel harus dilakukan dalam posisi fungsi fungsi bersarang atau dalam urutan panggilan fungsi. Ditambah dengan gangguan mekanisme ini, pencarian variabel sangat rentan terhadap kesalahan. Ini sebenarnya disebabkan oleh dua model kerja lingkup. Lingkup dibagi menjadi ruang lingkup leksikal dan ruang lingkup dinamis. Dengan membedakan kedua model lingkup ini, Anda dapat memiliki pemahaman yang jelas tentang proses pencarian variabel. Artikel ini adalah bab kedua dari seri JavaScript SCOPE - LEXICAL SCOPE DAN SCOPE DYNAMIC
Ruang lingkup leksikal
Seperti yang disebutkan dalam artikel pertama, tahap kerja pertama dari kompiler disebut Word Participle, yang menguraikan string yang terdiri dari karakter menjadi unit leksikal. Konsep ini adalah dasar untuk memahami ruang lingkup leksikal
Sederhananya, ruang lingkup leksikal mendefinisikan ruang lingkup pada tahap leksikal, yang ditentukan oleh di mana variabel dan cakupan blok ditulis saat menulis kode. Oleh karena itu, ruang lingkup tetap tidak berubah ketika penganalisa leksikal memproses kode.
hubungan
Tidak peduli di mana fungsi itu disebut, dan tidak peduli bagaimana itu disebut, ruang lingkup leksikalnya ditentukan hanya oleh posisi di mana fungsi dinyatakan.
function foo (a) {var b = a * 2; batang fungsi (c) {console.log (a, b, c);} bar (b * 3);} foo (2); // 2 4 12Dalam contoh ini, ada tiga lingkup bersarang. Untuk membantu memahami, menganggapnya sebagai beberapa gelembung yang termasuk langkah demi langkah
Gelembung lingkup ditentukan oleh di mana kode blok lingkup yang sesuai ditulis, dan mereka termasuk langkah demi langkah.
Bubble 1 berisi seluruh ruang lingkup global, dengan hanya satu pengidentifikasi: foo
Bubble 2 berisi ruang lingkup yang dibuat oleh foo, yang memiliki tiga pengidentifikasi: a, bar, dan b
Bubble 3 berisi ruang lingkup yang dibuat oleh bar, dengan hanya satu pengidentifikasi: C
Menemukan
Struktur gelembung -gelembung yang dilingkupi dan hubungan posisinya memberikan mesin dengan informasi posisi yang cukup, yang digunakan mesin untuk menemukan lokasi pengidentifikasi.
Dalam cuplikan kode, mesin menjalankan deklarasi Console.log (...) dan mencari referensi ke tiga variabel A, B dan C. Pertama -tama dimulai dengan ruang lingkup terdalam, yaitu ruang lingkup fungsi bar (...). Mesin tidak dapat menemukan di sini, sehingga akan menuju ke tingkat sebelumnya untuk terus mencari di ruang lingkup Foo bersarang (...). A ditemukan di sini, jadi mesin menggunakan referensi ini. Hal yang sama berlaku untuk b. Dan untuk C, mesin menemukannya di bar (...)
[CATATAN] Pencarian lingkup leksikal hanya akan mencari pengidentifikasi tingkat pertama. Jika kode referensi foo.bar.baz, pencarian lingkup leksikal hanya akan mencoba mencari pengidentifikasi foo. Setelah menemukan variabel ini, aturan akses atribut objek masing -masing mengambil alih akses ke atribut BAR dan BAZ masing -masing
foo = {bar: {baz: 1}}; console.log (foo.bar.baz); // 1Menutupi
Pencarian lingkup dimulai dari ruang lingkup terdalam di mana runtime berada, dan melanjutkan langkah demi langkah ke luar atau ke atas hingga pengidentifikasi pencocokan pertama dipenuhi.
Pengidentifikasi dengan nama yang sama dapat didefinisikan dalam lingkup bersarang multi-lapisan, yang disebut "efek oklusi". Pengidentifikasi internal "oklude" pengidentifikasi eksternal
var a = 0; function test () {var a = 1; console.log (a); // 1} test ();Variabel global secara otomatis atribut objek global, sehingga mereka dapat diakses secara langsung dengan mengacu pada atribut objek global alih -alih secara langsung melewati nama leksikal objek global.
var a = 0; function test () {var a = 1; console.log (window.a); // 0} test ();Teknik ini memungkinkan akses ke variabel global yang dikaburkan oleh variabel dengan nama yang sama. Tetapi jika variabel non-global diblokir, mereka tidak dapat diakses apa pun yang terjadi.
Ruang lingkup dinamis
JavaScript menggunakan ruang lingkup leksikal, dan fitur yang paling penting adalah bahwa proses definisi terjadi selama tahap penulisan kode.
Lalu mengapa memperkenalkan ruang lingkup dinamis? Faktanya, ruang lingkup dinamis adalah mekanisme penting lain dari JavaScript untuk sepupu ini. Sebagian besar kebingungan ruang lingkup adalah karena ruang lingkup leksikal dan mekanisme ini bingung, jadi saya tidak bisa membedakan antara bodoh
Lingkup dinamis tidak peduli tentang bagaimana fungsi dan ruang lingkup dinyatakan dan dinyatakan di mana saja, hanya dari mana mereka dipanggil. Dengan kata lain, rantai lingkup didasarkan pada tumpukan panggilan, bukan lingkup bersarang dalam kode
var a = 2; function foo () {console.log (a);} batang fungsi () {var a = 3; foo ();} bar ();[1] Jika berada dalam ruang lingkup leksikal, itu adalah lingkungan JavaScript saat ini. Variabel A pertama kali dicari dalam fungsi foo (), tetapi tidak ditemukan. Jadi ikuti rantai ruang lingkup untuk mencari di ruang lingkup global, temukan dan tetapkan nilai 2. Jadi konsol output 2
【2】 Jika berada dalam ruang lingkup dinamis, juga, variabel A pertama kali dicari dalam foo () dan tidak ditemukan. Di sini, Anda akan mengikuti tumpukan panggilan untuk mencari di tempat di mana fungsi foo () dipanggil, yaitu, fungsi bar (), temukan dan tetapkan nilai ke 3. Jadi output konsol 3
Ringkasan: Perbedaan antara dua lingkup. Singkatnya, ruang lingkup leksikal ditentukan pada waktu definisi, sedangkan ruang lingkup dinamis ditentukan saat runtime.
Di atas adalah bagian kedua dari ruang lingkup leksikal dan ruang lingkup dinamis yang diperkenalkan oleh editor kepada Anda. Saya harap ini akan membantu Anda. Jika Anda ingin tahu lebih banyak, harap perhatikan wulin.com!