Rumah  >  Artikel  >  hujung hadapan web  >  Mengapa Penutupan dalam Gelung Menjadikan Semua Pautan Memaparkan Nilai yang Sama?

Mengapa Penutupan dalam Gelung Menjadikan Semua Pautan Memaparkan Nilai yang Sama?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-27 21:41:30990semak imbas

 Why Do Closures in Loops Make All Links Display the Same Value?

Penutupan JavaScript dalam Gelung: Demystified

Memahami Penutupan

Penutupan dalam JavaScript membenarkan fungsi mengakses pembolehubah dari luar segeranya skop, mewujudkan konteks data peribadi. Walau bagaimanapun, pembolehubah yang dirujuk oleh penutupan kekal boleh diakses walaupun selepas fungsi penutup telah selesai dilaksanakan.

Isu dengan Penutupan dalam Gelung

Pertimbangkan coretan kod berikut:

<code class="javascript">for (var i = 0; i < 5; i++) {
  link = document.createElement("a");
  link.innerHTML = "Link " + i;
  link.onclick = function (num) {
    return function () {
      alert(num);
    };
  }(i);
  document.body.appendChild(link);
}</code>

Dalam contoh ini, nilai i yang dihantar ke fungsi dalaman sebagai num ditangkap oleh penutupan mewujudkan "pembolehubah dikongsi" merentas semua elemen pautan. Ini bermakna mengklik mana-mana pautan akan sentiasa memaparkan nilai terakhir i (4 dalam kes ini).

Menggunakan IIFE (Ungkapan Fungsi Yang Dikenakan Segera) sebagai Kilang Fungsi

Untuk menyelesaikan isu ini, buat IIFE untuk setiap pautan, menghantar nilai i sebagai hujah:

<code class="javascript">function addLinks() {
  for (var i = 0; i < 5; i++) {
    link = document.createElement("a");
    link.innerHTML = "Link " + i;

    // IIFE used as a function factory
    link.onclick = (function (num) {
      return function () {
        alert(num);
      };
    })(i);
    document.body.appendChild(link);
  }
}</code>

Dalam versi ini, setiap IIFE mencipta skop terpencil di mana nilai i dibekukan pada masa penciptaan fungsi. Ini memastikan setiap elemen pautan mempunyai salinan peribadi i sendiri, tanpa mengira susunan ia diklik.

Pendekatan Alternatif: Penjana Fungsi

Pilihan lain ialah untuk menggunakan penjana fungsi untuk mencipta fungsi yang merujuk nilai semasa i:

<code class="javascript">function generateMyHandler(x) {
  return function () {
    alert(x);
  };
}

for (var i = 0; i < 5; i++) {
  link = document.createElement("a");
  link.innerHTML = "Link " + i;
  link.onclick = generateMyHandler(i);
  document.body.appendChild(link);
}</code>

Dalam kes ini, fungsi generateMyHandler mengembalikan fungsi baharu yang telah terikat kepada nilai khusus i pada masa panggilan fungsi.

Dengan memahami cara penutupan JavaScript menangkap pembolehubah dan menggunakan teknik yang sesuai untuk mencipta skop terpencil, pembangun boleh mengendalikan senario gelung kompleks yang melibatkan pembolehubah kongsi dengan berkesan.

Atas ialah kandungan terperinci Mengapa Penutupan dalam Gelung Menjadikan Semua Pautan Memaparkan Nilai yang Sama?. 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