Pertama, mari kita lihat sepotong kode:
Salinan kode adalah sebagai berikut:
<a href = "javascript: void (0);"> 111 </a>
<a href = "javascript: void (0);"> 222 </a>
<a href = "javacsript: void (0);"> 333 </a>
var a = document.geteLementsbyTagname ("a");
fungsi b () {
untuk (var i = 0; i <a.length; i ++) {
a [i] .Onclick = function () {
waspada (i);
}
}
}
Menurut niat desain asli kami, itu harus mengklik tag A untuk memunculkan nomor seri yang sesuai dari tag, yaitu, klik pada yang pertama muncul 0, dan klik pada yang kedua untuk muncul 1 ... tetapi faktanya adalah bahwa jumlah tag yang selalu muncul selalu merupakan jumlah tag A. Apa alasannya? Masalah ini telah mengganggu saya sejak lama. Saya telah berkonsultasi dengan banyak materi online dan buku referensi. Kebanyakan dari mereka masuk akal. Saya percaya bahwa banyak siswa tidak tahu banyak tentang alasannya. Saya akan berbicara tentang pemahaman saya tentang masalah ini. Jika ada ketidaksesuaian, silakan mengkritik dan mengoreksi saya.
Dalam pemahaman pribadi saya, alasan mengapa fungsi di atas gagal mencapai tujuannya adalah bahwa fungsi pemrosesan peristiwa mengikat variabel I, dan fungsi pemrosesan acara ditugaskan untuk OnClick, yaitu, fungsi hanya akan dipanggil ketika tag diklik. Oleh karena itu, secara logis, fungsi () {alert (i);} Dalam loop yang sederhana sebenarnya tidak dieksekusi, dan ketika kita mengklik tag A, loop untuk telah dieksekusi. Pada saat ini, nilai i adalah nilai akhir dari eksekusi loop untuk. Agar sederhana, nilai saya milik fungsi B, dan nilai yang kita butuhkan adalah nilai yang diteruskan ke fungsi pemrosesan acara secara real time. Jadi adakah cara untuk mewujudkan niat desain asli kita? Teman sekelas yang pintar mungkin telah menduga bahwa ia menggunakan penutupan.
Mari kita lihat kode lain:
Salinan kode adalah sebagai berikut:
var a = document.geteLementsbyTagname ("a");
fungsi b () {
untuk (var i = 0; i <a.length; i ++) {
a [i] .onClick = function (j) {
return function () {
waspada (j);
}
}(Saya);
}
}
B();
Jalankan kode di atas dan Anda akan menemukan bahwa fungsi yang kami inginkan telah diimplementasikan, yaitu, mengklik tag apa pun A akan memunculkan nomor seri di mana tag berada. Saya percaya banyak siswa telah melihat banyak versi serupa dari kode di atas, tetapi mengapa kita dapat mencapai fungsi yang kita butuhkan dengan melakukan ini? Ini adalah pendapat pribadi saya. Jika ada ketidaksesuaian, tolong beri saya beberapa saran.
Inti dari pemahaman tentang kode di atas adalah pemahaman variabel i. Dalam kode ini, ketika fungsi dieksekusi dan loop untuk ditemukan, fungsi panggilan langsung ditemukan. Pada saat ini, nilai variabel I real-time diteruskan ke fungsi panggilan langsung. Fungsi ini dipanggil segera dan fungsi pemrosesan acara menyimpan nilai variabel I real-time.
Di atas adalah semua tentang artikel ini. Saya berharap ini akan membantu untuk pemahaman semua orang tentang penutupan JS.