Dalam setiap bahasa pemrograman, variabel -variabelnya memiliki jangkauan yang valid. Setelah melebihi rentang ini, variabel akan menjadi tidak valid. Ini adalah ruang lingkup variabel. Dari sudut pandang matematika, itu adalah domain variabel independen.
Lingkup adalah kisaran variabel yang dapat diakses, yaitu ruang lingkup mengontrol visibilitas dan siklus hidup variabel dan fungsi. Dalam JavaScript, objek dan fungsi juga merupakan variabel, dan variabel didefinisikan di dalam tubuh fungsi sewenang -wenang yang bersarang dengan menyatakan tubuh fungsinya dan tubuh fungsi sewenang -wenang bersarang.
1. Lingkup statis dan ruang lingkup dinamis
Ruang lingkup statis
Ini berarti bahwa ruang lingkup deklarasi ditentukan pada waktu kompilasi berdasarkan badan program, juga dikenal sebagai ruang lingkup leksikal. Sebagian besar bahasa pemrograman modern mengadopsi aturan ruang lingkup statis, dan JavaScript mengadopsi ruang lingkup ini.
Dalam bahasa yang menggunakan lingkup statis, aturan ruang lingkup bersarang yang paling dalam pada dasarnya adalah: pengidentifikasi yang diperkenalkan oleh deklarasi terlihat dalam ruang lingkup di mana deklarasi berada, dan juga dalam setiap ruang lingkup yang bersarang di dalam, kecuali jika ditutupi oleh deklarasi lain dari nama yang sama pengidentifikasi yang bersarang di dalam.
Untuk menemukan objek yang dirujuk oleh pengidentifikasi yang diberikan, itu harus ditemukan dalam ruang lingkup terdalam saat ini. Jika deklarasi ditemukan, objek yang dirujuk oleh pengidentifikasi dapat ditemukan. Kalau tidak, kami akan mencari di ruang lingkup luar langsung dan terus memeriksa ruang lingkup luar untuk ke luar sampai kami mencapai tingkat sarang terluar dari program, yaitu, ruang lingkup di mana deklarasi objek global berada. Jika tidak ada deklarasi yang ditemukan di semua tingkatan, maka program tersebut memiliki kesalahan. sebagai berikut:
function cha () {var name = "xiao;" fungsi chb () {function chc () {console.log (name); }}}Pertama, fungsi mencari definisi nama dari chb (), dan kemudian terus mencari lapisan demi lapisan. Akhirnya, definisi nama ditemukan di cha (). Jika tidak ditemukan, kesalahan akan dilaporkan.
2. Lingkup Dinamis
Dalam bahasa yang dilingkup secara dinamis, objek yang dirujuk oleh variabel dalam program ditentukan berdasarkan informasi aliran kontrol program pada saat program berjalan.
2. Lingkup JavaScript
Ada dua lingkup dalam JavaScript, yaitu ruang lingkup global dan ruang lingkup lokal.
1. Lingkup Global
Ada definisi di mana saja dalam kode. Bahkan jika variabel global didefinisikan dalam sepotong kode JS yang bersarang di halaman HTML, variabel tersebut masih dapat diakses dalam file JS yang direferensikan. Ini sangat mungkin menyebabkan polusi ke variabel global.
Variabel dalam tiga kasus berikut akan dianggap variabel global
(1) Fungsi terluar dan variabel terluar memiliki ruang lingkup global
(2) Variabel yang ditetapkan secara langsung tanpa definisi secara otomatis dinyatakan memiliki ruang lingkup global
(3) Properti semua objek jendela memiliki ruang lingkup global
2. Lingkup lokal
Lingkup lokal umumnya dapat diakses hanya dalam cuplikan kode tetap, seperti variabel di dalam fungsi (lingkup fungsi)
var name = "xuxiaoping"; function echoname () {var firstName = "xu"; // lingkup lokal SecondName = "xiao"; // fungsi lingkup global echofirstname () {console.log (nama depan); // xu} console.log (detik); return echofirstName;} console.log (name); // Global Scope var f = echoname (); f (); console.log (firstName); console.log (detik);Hasilnya adalah:
xuxiaoping
xiao
xu // fungsi dalam dapat mengakses variabel fungsi luar
tidak terfined // Variabel internal fungsi tidak dapat diakses di luar fungsi
xiao
JavaScript melampirkan variabel global ke objek jendela dan menjadi properti objek jendela.
3. Lingkup fungsi
Lingkup Level Blok: Setiap set pernyataan dalam kawat gigi milik blok, dan semua variabel yang didefinisikan dalam hal ini tidak terlihat di luar blok kode. Sebagian besar bahasa C-Class memiliki lingkup tingkat blok.
Namun, fitur penting dari JavaScript adalah bahwa ia tidak memiliki ruang lingkup tingkat blok.
fungsi echoi () {for (var i = 0; i <10; i ++) {; // console.log (i); } if (true) {var str = "hello"; } console.log (i); console.log (str);} echoi ();Hasil outputnya adalah:
10
Halo
Dapat dilihat bahwa di luar pernyataan untuk (atau jika, sementara), variabel yang saya tentukan di blok masih dapat diakses. Artinya, JavaScript tidak mendukung lingkup level blok, hanya mendukung lingkup fungsi, dan variabel yang didefinisikan di mana saja dalam fungsi dapat terlihat di mana saja dalam fungsi itu. Sebagai seseorang yang belajar C dan Java sejak awal, ini agak sulit untuk beradaptasi. Menurut tes saya, hal yang sama berlaku untuk PHP.
Tentu saja, Anda dapat menggunakan karakteristik penutupan javascript untuk mensimulasikan ruang lingkup tingkat blok
fungsi echoi () {(function () {for (var i = 0; i <10; i ++) {; // console.log (i);}}) (); if (true) {var str = "hello"; } console.log (i); console.log (str);} echoi ();Hasilnya adalah: Saya tidak ditentukan
Ini mengisolasi definisi variabel. Di JS, untuk mencegah penamaan konflik, variabel global dan fungsi global harus dihindari sebanyak mungkin, sehingga penutupan semacam ini digunakan dalam banyak hal.
4. Siklus hidup variabel javascript
Siklus hidup variabel JavaScript diinisialisasi ketika dinyatakan.
Variabel lokal dihancurkan setelah fungsi dieksekusi.
Variabel global dihancurkan setelah halaman ditutup.
3. Rantai Lingkup JavaScript
Sepertinya rantai, mungkin dapat dikombinasikan dengan daftar tertaut dalam struktur data.
Dalam JavaScript, fungsi adalah objek, tetapi pada kenyataannya, semua yang ada di JavaScript adalah objek. Objek fungsi, seperti objek lainnya, memiliki properti yang dapat diakses melalui kode dan serangkaian properti internal yang hanya dapat diakses ke mesin JavaScript. Salah satu sifat internal adalah [[lingkup]], yang ditentukan oleh edisi ketiga dari standar ECMA-262. Properti internal ini berisi kumpulan objek dalam ruang lingkup yang dibuat oleh fungsi. Koleksi ini disebut Rantai Fungsi Lingkup, yang menentukan data mana yang dapat diakses oleh fungsi.
Ketika suatu fungsi dibuat, rantai ruang lingkupnya diisi dengan objek data yang dapat diakses dalam ruang lingkup fungsi. Misalnya, tentukan fungsi seperti ini:
fungsi add (num1, num2) {var sum = num1 + num2; kembalikan jumlah;}Ketika fungsi penambahan dibuat, objek global akan diisi dalam rantai ruang lingkupnya, yang berisi semua variabel global, seperti yang ditunjukkan pada gambar di bawah ini (Catatan: Gambar hanya memberikan beberapa variabel):
Lingkup fungsi ADD akan digunakan selama eksekusi. Misalnya, jalankan kode berikut:
var total = add (5,10);
Saat menjalankan fungsi ini, objek internal yang disebut "konteks eksekusi" dibuat. Konteks runtime mendefinisikan lingkungan di mana fungsi dieksekusi. Setiap konteks runtime memiliki rantai ruang lingkupnya sendiri untuk parsing pengidentifikasi. Ketika konteks runtime dibuat, rantai ruang lingkupnya diinisialisasi sebagai objek yang terkandung dalam [[lingkup]] dari fungsi berjalan saat ini.
Nilai -nilai ini disalin ke dalam rantai ruang lingkup konteks runtime dalam urutan di mana mereka muncul dalam fungsi. Bersama -sama mereka membentuk objek baru yang disebut "Objek Aktivasi", yang berisi semua variabel lokal, parameter bernama, set parameter dan fungsi ini. Maka objek ini akan didorong ke ujung depan rantai lingkup. Ketika konteks berjalan dihancurkan, objek aktif akan dihancurkan. Rantai lingkup baru ditunjukkan pada gambar di bawah ini:
Selama eksekusi fungsi, setiap kali variabel ditemui, proses pengenal pengenal akan diteruskan untuk memutuskan di mana harus mendapatkan dan menyimpan data. Proses ini dimulai dari kepala rantai ruang lingkup, yaitu mencari pengidentifikasi dengan nama yang sama dari objek aktif. Jika ditemukan, gunakan variabel yang sesuai dengan pengidentifikasi ini. Jika tidak ditemukan, terus cari objek berikutnya dalam rantai lingkup. Jika semua objek tidak ditemukan setelah pencarian, pengidentifikasi dianggap tidak ditentukan. Selama pelaksanaan fungsi, masing -masing pengidentifikasi harus melalui proses pencarian seperti itu.
4. Rantai SCOPE DAN OPTIMERASI KODE
Dari struktur rantai lingkup, dapat dilihat bahwa dalam rantai lingkup konteks runtime, semakin dalam pengidentifikasi, semakin lambat kecepatan baca dan tulis. Seperti yang ditunjukkan pada gambar di atas, karena variabel global selalu ada di akhir rantai ruang lingkup konteks selama runtime, itu adalah yang paling lambat untuk menemukan variabel global ketika menguraikan pengidentifikasi. Oleh karena itu, saat menulis kode, Anda harus mencoba menggunakan variabel global sesedikit mungkin dan menggunakan variabel lokal sebanyak mungkin. Aturan praktis yang baik adalah: jika objek silang-scope direferensikan lebih dari sekali, simpan dalam variabel lokal sebelum digunakan. Misalnya, kode berikut:
function changeColor () {document.getElementById ("btnchange"). onclick = function () {document.getElementById ("targetCanvas"). style.backgroundColor = "red"; };}Fungsi ini mengacu pada dokumen variabel global dua kali. Variabel harus dicari melalui seluruh rantai ruang lingkup sampai akhirnya ditemukan di objek global. Kode ini dapat ditulis ulang sebagai berikut:
function changeColor () {var doc = dokumen; doc.getElementById ("btnchange"). onclick = function () {doc.getElementById ("targetCanvas"). style.backgroundColor = "red"; };}Kode ini relatif sederhana dan tidak akan menunjukkan peningkatan kinerja yang sangat besar setelah menulis ulang, tetapi jika sejumlah besar variabel global dalam program diakses berulang kali, kinerja kode setelah penulisan ulang akan ditingkatkan secara signifikan.
5. dengan rantai lingkup perubahan
Konteks runtime yang sesuai adalah unik setiap kali angka dieksekusi, jadi memanggil fungsi yang sama beberapa kali akan mengarah pada penciptaan beberapa konteks runtime. Ketika fungsi dieksekusi, konteks eksekusi akan dihancurkan. Setiap konteks runtime dikaitkan dengan rantai lingkup. Secara umum, selama konteks berjalan, rantai ruang lingkupnya hanya akan dipengaruhi oleh pernyataan dengan dan pernyataan tangkapan.
Pernyataan dengan adalah cara cepat untuk menerapkan objek untuk menghindari menulis kode duplikat. Misalnya:
function initUi () {with (document) {var bd = body, links = getElementsbyTagname ("a"), i = 0, len = links.length; while (i <len) {update (tautan [i ++]); } getElementById ("btninit"). onclick = function () {dosomething (); }; }}Gunakan pernyataan lebar di sini untuk menghindari menulis dokumen beberapa kali, yang terlihat lebih efisien, tetapi sebenarnya menciptakan masalah kinerja.
Ketika kode berjalan ke pernyataan dengan dengan rantai ruang lingkup konteks runtime diubah sementara. Objek yang dapat berubah baru dibuat, yang berisi semua properti dari objek yang ditentukan oleh parameter. Objek ini akan didorong ke kepala rantai lingkup, yang berarti bahwa semua variabel lokal fungsi sekarang berada di objek rantai lingkup kedua, jadi akses lebih mahal. Seperti yang ditunjukkan pada gambar di bawah ini:
Oleh karena itu, dengan pernyataan harus dihindari dalam program. Dalam contoh ini, cukup menyimpan dokumen dalam variabel lokal dapat meningkatkan kinerja.
Meringkaskan
1. Lingkup variabel adalah di mana ruang lingkup variabel valid.
2. Rantai lingkup variabel adalah kumpulan objek dalam ruang lingkup yang dibuat.
Di atas adalah semua tentang artikel ini, saya harap akan sangat membantu bagi semua orang untuk mempelajari pemrograman JavaScript.