JavaScript mencakup konsep -konsep seperti lingkup (lingkup), rantai lingkup (rantai lingkup), mengeksekusi konteks (konteks eksekusi), objek aktif (objek aktif), ruang lingkup dinamis (lingkup dinamis), dan penutupan (penutupan). Untuk memahami konsep -konsep ini, kami menganalisisnya dari aspek statis dan dinamis.
Pertama, mari kita tulis fungsi sederhana untuk membuat contoh:
Salinan kode adalah sebagai berikut:
fungsi add (num1, num2) {
var sum = num1 + num2;
jumlah pengembalian;
}
Kami mendefinisikan fungsi tambah dengan dua parameter formal.
Aspek statis:
Saat membuat fungsi ADD, mesin JavaScript akan membuat rantai lingkup fungsi ADD, dan rantai lingkup ini menunjuk ke konteks global. Jika Anda menggunakan representasi grafis, gambar berikut ditampilkan:
Seperti dapat dilihat dari gambar di atas, ketika fungsi ADD dibuat, rantai lingkup telah dibuat, sehingga kita dapat menarik kesimpulan bahwa rantai ruang lingkup fungsi dibuat ketika fungsi dibuat, daripada periode berjalan dinamis. Mari kita lihat apa yang terjadi selama menjalankan dinamis.
Aspek Dinamis:
Saat mengeksekusi fungsi Tambah, JavaScript akan membuat konteks eksekusi, yang berisi semua informasi yang diperlukan selama runtime dari fungsi Add. Eksekusi konteks juga memiliki rantai ruang lingkupnya sendiri. Saat fungsi sedang berjalan, mesin JavaScript pertama -tama akan menginisialisasi rantai ruang lingkup konteks eksekusi dari rantai lingkup fungsi ADD, dan kemudian mesin JavaScript akan membuat objek aktif, yang berisi semua variabel lokal, parameter, dan variabel ini dan lainnya selama runtime fungsi.
Jika gambar dijelaskan, apa yang terjadi selama runtime dinamis dari fungsi ADD, dapat dijelaskan pada gambar berikut:
Seperti yang dapat dilihat dari gambar di atas, konteks eksekusi adalah konsep yang dinamis. Itu dibuat saat fungsi berjalan. Pada saat yang sama, objek objek aktif juga merupakan konsep yang dinamis. Ini dirujuk oleh rantai ruang lingkup konteks eksekusi. Oleh karena itu, dapat disimpulkan bahwa baik konteks eksekusi dan objek aktif adalah konsep dinamis, dan rantai ruang lingkup konteks eksekusi diinisialisasi oleh rantai lingkup fungsi.
Pembicaraan di atas tentang ruang lingkup ruang lingkup fungsi dan konteks eksekusi. Mari kita bicara tentang masalah ruang lingkup dinamis. Ketika JavaScript lewat dengan pernyataan, cobalah klausa tangkapan tangkapan, dan metode evaluasi, mesin JavaScript akan secara dinamis mengubah ruang lingkup konteks eksekusi. Mari kita lihat dengan contoh:
Salinan kode adalah sebagai berikut:
fungsi initui () {
dengan (dokumen) {// hindari!
var bd = tubuh,
tautan = getElementsbyTagname ("a"),
i = 0,
len = links.length;
while (i <len) {
UPDATE (tautan [i ++]);
}
getElementById ("go-btn"). onclick = function () {
awal();
};
bd.classname = "aktif";
}
Saat mengeksekusi fungsi initUI di atas, JavaScript akan secara dinamis membuat ruang lingkup yang sesuai dengan pernyataan dengan WIT dan letakkan di ujung depan rantai lingkup konteks eksekusi. Proses di atas dapat dijelaskan dengan jelas melalui gambar di bawah ini. Area bertanda merah di bawah ini menunjukkan ruang lingkup yang dihasilkan oleh pernyataan dengan.
Akhirnya, mari kita lihat penutupan paling misterius di JavaScript. Penutupan sebenarnya merupakan fungsi dalam JavaScript. Penutupan dibuat selama runtime fungsi. Mari kita ambil contoh untuk melihat:
Salinan kode adalah sebagai berikut:
function fecueEvents () {
var id = "xdi9592";
document.geteLementById ("save-btn"). onclick = function (event) {
saveDocument (id);
};
}
Ketika fungsi penugasan di atas dieksekusi, penutupan akan dibuat, dan penutupan ini akan merujuk pada variabel ID dalam ruang lingkup penugasan. Jika, menurut bahasa pemrograman tradisional, ID adalah variabel yang disimpan di tumpukan. Ketika fungsi dieksekusi, ID menghilang, jadi bagaimana bisa direferensikan lagi? Jelas, JavaScript mengadopsi cara lain di sini. Mari kita lihat bagaimana JavaScript mengimplementasikan penutupan. Saat mengeksekusi fungsi Petugas Tugas, mesin JavaScript akan membuat rantai ruang lingkup konteks eksekusi dari fungsi JecananEvents. Rantai ruang lingkup ini berisi objek aktif ketika penugasan dieksekusi. Pada saat yang sama, mesin JavaScript juga akan membuat penutupan, dan rantai ruang lingkup penutupan juga akan merujuk pada objek aktif ketika penugasan dieksekusi. Dengan cara ini, ketika penugasan dieksekusi, meskipun rantai ruang lingkup konteks eksekusi sendiri tidak lagi mengacu pada objek aktif, penutupan masih mengacu pada objek aktif yang sesuai dengan runtime AssignEvents, yang menjelaskan mekanisme penutupan di dalam JavaScript. Anda dapat menggunakan angka berikut untuk menggambarkan situasi runtime fungsi Function di atas:
Seperti yang dapat dilihat dari yang di atas, setelah fungsi penugasan dieksekusi, document.getElementById ("save-btn"). OnClick mengacu pada penutupan. Dengan cara ini, ketika pengguna mengklik Save-BTN, pelaksanaan penutupan akan dipicu. Mari kita lihat situasi ketika penutupan dieksekusi. Seperti yang disebutkan sebelumnya, penutupan dalam JavaScript sebenarnya adalah fungsi, sehingga situasi eksekusi penutupan dan eksekusi fungsi konsisten. Gambar berikut akan dengan jelas menggambarkan penutupan yang terkait dengan acara OnClick di atas.
Dari gambar di atas, kita dapat melihat bahwa mesin JavaScript terlebih dahulu menciptakan konteks eksekusi penutupan, kemudian menggunakan rantai ruang lingkup penutupan untuk menginisialisasi rantai ruang lingkup konteks eksekusi penutupan, dan akhirnya menempatkan objek aktif yang sesuai ketika penutupan dieksekusi di ujung depan ruang lingkup, yang selanjutnya memverifikasi bahwa penutupan adalah suatu fungsi.