Terdapat konsep seperti Skop (skop), rantai Skop (rantaian skop), Konteks Laksana (konteks pelaksanaan), Objek Aktif (objek aktif), Skop Dinamik (skop dinamik) dan Penutupan (penutupan) dalam JavaScript memahami konsep ini, kami menganalisisnya dari dua aspek: statik dan dinamik.
Mula-mula kita menulis fungsi mudah sebagai contoh:
Kami mentakrifkan fungsi tambah dengan dua parameter formal.
Aspek statik:
Apabila mencipta fungsi tambah, enjin Javascript akan mencipta rantaian Skop fungsi tambah ini menghala ke Konteks Global. Jika ia dinyatakan secara grafik seperti yang ditunjukkan di bawah:
Seperti yang dapat dilihat dari rajah di atas, apabila fungsi tambah dicipta, rantai skop telah pun dibuat Oleh itu, kita boleh membuat kesimpulan bahawa rantai skop fungsi telah dicipta apabila fungsi itu dicipta. dan bukannya secara dinamik. Mari kita lihat apa yang berlaku semasa masa jalan dinamik.
Aspek dinamik:
Apabila fungsi tambah dilaksanakan, JavaScript akan mencipta konteks Laksana, yang mengandungi semua maklumat yang diperlukan semasa masa jalan fungsi tambah. Konteks pelaksanaan juga mempunyai rantai Skopnya sendiri Apabila fungsi berjalan, enjin JavaScript akan mula-mula memulakan rantai skop konteks pelaksanaan daripada rantaian skop fungsi tambah, dan kemudian enjin JavaScript akan mencipta Objek Aktif, yang mengandungi Semua. pembolehubah tempatan, parameter, dan ini serta pembolehubah lain semasa masa jalan fungsi.
Jika anda menerangkan dengan jelas perkara yang berlaku semasa masa jalan dinamik fungsi tambah, anda boleh menggunakan angka berikut untuk menerangkannya:
Seperti yang dapat dilihat dari rajah di atas, konteks pelaksanaan adalah konsep dinamik Ia dicipta apabila fungsi dijalankan Pada masa yang sama, objek Active Object juga merupakan konsep dinamik rantaian konteks pelaksanaan. Oleh itu, kita boleh membuat kesimpulan: konteks pelaksanaan dan objek aktif ialah konsep dinamik, dan rantai skop konteks pelaksanaan dimulakan oleh rantai skop fungsi.
Skop fungsi dan skop konteks pelaksanaan yang disebutkan di atas Mari kita bincangkan tentang isu skop dinamik Apabila menggunakan pernyataan dengan, klausa tangkapan cuba-tangkap, dan kaedah eval dalam JavaScript, enjin JavaScript akan menukar secara dinamik. skop konteks pelaksanaan. Mari kita lihat melalui contoh:
Apabila fungsi assignEvents di atas dilaksanakan, penutupan akan dibuat dan penutupan ini akan merujuk kepada pembolehubah id dalam skop assignEvents Jika anda mengikuti pendekatan bahasa pengaturcaraan tradisional, id ialah pembolehubah yang disimpan pada timbunan selepas fungsi itu dilaksanakan, jadi bagaimana ia boleh dirujuk semula? Jelas sekali JavaScript mengambil pendekatan lain di sini. Mari kita lihat cara JavaScript melaksanakan penutupan. Apabila fungsi assignEvents dilaksanakan, enjin JavaScript akan mencipta rantaian skop konteks pelaksanaan fungsi assignEvents ini mengandungi objek aktif apabila assignEvents dilaksanakan Pada masa yang sama, enjin JavaScript juga akan membuat penutupan skop penutupan Rantaian juga akan merujuk kepada objek aktif apabila assignEvent dilaksanakan, supaya apabila assignEvents dilaksanakan, walaupun rantai skop konteks pelaksanaannya sendiri tidak lagi merujuk kepada objek aktif, penutupan masih merujuk kepada objek aktif sepadan dengan assignEvents runtime This Ini menerangkan mekanisme penutupan dalam JavaScipt. Angka berikut boleh digunakan untuk menerangkan situasi dengan jelas semasa masa jalan fungsi assignEvents di atas:
Seperti yang dapat dilihat daripada di atas, selepas fungsi assignEvents dilaksanakan, document.getElementById("save-btn").onclick merujuk penutupan, supaya apabila pengguna mengklik save-btn, pelaksanaan penutupan akan dicetuskan, kemudian mari kita lihat situasi apabila penutupan dilaksanakan. Seperti yang dinyatakan sebelum ini, penutupan dalam JavaScript sebenarnya adalah fungsi, jadi keadaan apabila penutupan dilaksanakan adalah sama seperti apabila fungsi itu dilaksanakan Rajah berikut dengan jelas menerangkan penutupan yang dikaitkan dengan peristiwa onclick di atas.
Seperti yang dapat dilihat daripada rajah di atas, enjin JavaScript mula-mula mencipta konteks pelaksanaan penutupan, kemudian menggunakan rantai skop penutupan untuk memulakan rantai skop konteks pelaksanaan penutupan, dan akhirnya meletakkan objek aktif yang sepadan apabila penutupan dilaksanakan dengan memasukkan bahagian hadapan skop mengesahkan lagi penegasan bahawa penutupan adalah fungsi.