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
Linda Hamiltonasal
2024-12-28 05:40:15864semak imbas

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);
  }
}

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);
  }
}

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);
  }
}

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!

Kenyataan:
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