Rumah > hujung hadapan web > tutorial js > Mengapakah Gelung JavaScript Saya Sentiasa Mengeluarkan Nilai Akhir Pembolehubah Kaunter Apabila Melampirkan Pengendali Acara?

Mengapakah Gelung JavaScript Saya Sentiasa Mengeluarkan Nilai Akhir Pembolehubah Kaunter Apabila Melampirkan Pengendali Acara?

Linda Hamilton
Lepaskan: 2024-12-28 05:40:15
asal
848 orang telah melayarinya

Why Does My JavaScript Loop Always Output the Final Value of the Counter Variable When Attaching Event Handlers?

Anomali Gelung Terkenal JavaScript: Diterangkan

Isu gelung JavaScript yang terkenal timbul apabila cuba melampirkan pengendali acara pada elemen yang dijana secara dinamik menggunakan gelung. Dalam coretan berikut:

function addLinks() {
  for (var i = 0, link; i < 5; i++) {
    link = document.createElement("a");
    link.innerHTML = "Link " + i;
    link.onclick = function () {
      alert(i); // WRONG: i will always be 5
    };
    document.body.appendChild(link);
  }
}
Salin selepas log masuk

Apabila mana-mana pautan yang dijana diklik, makluman sentiasa memaparkan "pautan 5." Ini kerana pembolehubah JavaScript yang ditakrifkan dengan var adalah skop fungsi, bukan skop blok. Apabila gelung berakhir, saya memegang nilai 5, dan semua fungsi dalaman merujuknya, membawa kepada output seragam.

Penyelesaian yang diperbetulkan terletak pada menangkap nilai i dalam penutupan. Pertimbangkan coretan ini:

function addLinks() {
  for (var i = 0, link; i < 5; i++) {
    link = document.createElement("a");
    link.innerHTML = "Link " + i;
    link.onclick = function (num) { // Closure around i
      return function () {
        alert(num); // num retains its original value
      };
    }(i); // Execute the outer function immediately to capture i
    document.body.appendChild(link);
  }
}
Salin selepas log masuk

Dalam kes ini, num terikat pada nilai semasa i untuk setiap lelaran. Apabila fungsi dalaman dilaksanakan, num ditetapkan secara konsisten kepada nilai i pada saat pelaksanaan gelung.

Selain itu, wujud alternatif yang cekap yang memanfaatkan nod DOM untuk menyimpan data:

function linkListener() {
  alert(this.i);
}

function addLinks() {
  for (var i = 0; i < 5; ++i) {
    var link = document.createElement('a');
    link.appendChild(document.createTextNode('Link ' + i));
    link.i = i;
    link.onclick = linkListener;
    document.body.appendChild(link);
  }
}
Salin selepas log masuk

Dengan melampirkan maklumat pada elemen DOM itu sendiri, keperluan untuk objek fungsi tambahan dielakkan, menambah baik kecekapan.

Atas ialah kandungan terperinci Mengapakah Gelung JavaScript Saya Sentiasa Mengeluarkan Nilai Akhir Pembolehubah Kaunter Apabila Melampirkan Pengendali Acara?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan