Dalam JavaScript, fungsi membentuk penutupan dengan mengekalkan pautan tersembunyi ke skop lampirannya. Ini menimbulkan persoalan: adakah mungkin untuk mengakses penutupan ini secara pengaturcaraan apabila fungsi tersedia sebagai nilai pembolehubah?
Motivasi utama di sebalik siasatan ini adalah teori, tetapi aplikasi praktikal boleh melibatkan penyenaraian sifat penutupan . Pertimbangkan kod berikut:
<code class="js">var x = (function(){ var y = 5; return function() { alert(y); }; })(); //access y here with x somehow</code>
Matlamatnya adalah untuk mengakses pembolehubah y menggunakan fungsi x.
Dalam persekitaran frontend, tempat anda boleh melaksanakan JavaScript anda dalam teg skrip sebelumnya, satu pendekatan adalah dengan melampirkan MutationObserver. Pemerhati ini menunggu teg skrip yang anda mahu periksa (x dalam kes ini) untuk dimasukkan ke dalam dokumen dan mengubah suai kodnya untuk mendedahkan kefungsian yang diingini.
Contohnya:
<code class="js">new MutationObserver((mutations, observer) => { // Find the target script tag const tamperTarget = document.querySelector('script + script'); if (!tamperTarget) { return; } observer.disconnect(); console.log('Target script getting tampered with'); // Modify the script's content to expose the closure tamperTarget.textContent = tamperTarget.textContent.replace( 'return function', 'window.y = y; return function' ); setTimeout(() => { console.log("Hacked into tamper target's script and found a y of", y); console.log('Could also have replaced the local y with another value'); }); }) .observe(document.body, { childList: true });</code>
Skrip ini melampirkan pemerhati pada dokumen.badan. Apabila teg skrip yang mengandungi fungsi x dimasukkan, pemerhati mencetus dan menggantikan fungsi kembali baris dengan window.y = y; fungsi kembali. Ini mendedahkan pembolehubah y sebagai pembolehubah global (window.y).
Seterusnya, anda boleh mengakses dan memanipulasi pembolehubah y seperti yang dikehendaki. Teknik ini boleh berguna untuk nyahpepijat, ujian dan percubaan dengan penutupan.
Atas ialah kandungan terperinci Bolehkah Anda Mengakses Penutupan Fungsi Secara Pengaturcaraan dalam JavaScript?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!