Rumah  >  Artikel  >  hujung hadapan web  >  Apabila Menggunakan Penutupan dalam Gelung JavaScript, Bagaimanakah Anda Boleh Memastikan Setiap Penutupan Menangkap Nilai yang Betul?

Apabila Menggunakan Penutupan dalam Gelung JavaScript, Bagaimanakah Anda Boleh Memastikan Setiap Penutupan Menangkap Nilai yang Betul?

Linda Hamilton
Linda Hamiltonasal
2024-10-16 17:49:02517semak imbas

When Using Closures in JavaScript Loops, How Can You Ensure Each Closure Captures the Correct Value?

Penutupan dalam Gelung JavaScript: Contoh Praktikal

Dalam JavaScript, isu biasa timbul apabila menggunakan penutupan dalam gelung, di mana nilai pembolehubah yang ditangkap oleh penutupan bukanlah nilai yang dijangkakan.

Masalah:

Apabila mentakrifkan fungsi dalam gelung menggunakan kata kunci var, semua fungsi merujuk pembolehubah yang sama di luar gelung. Ini boleh membawa kepada hasil yang tidak dijangka, seperti yang dilihat dalam kod di bawah:

<code class="js">var funcs = [];
for (var i = 0; i < 3; i++) {
  funcs[i] = function() {
    console.log("My value:", i);
  };
}</code>

Menjalankan kod ini mencetak "Nilai saya: 3" tiga kali, walaupun kami menjangkakan ia meningkat daripada 0 hingga 2.

Penyelesaian:

Penyelesaian ES6: Biarkan

Dalam ECMAScript 6 (ES6), kata kunci let memperkenalkan skop blok untuk pembolehubah, yang menyelesaikan masalah ini. Menggunakan let, setiap lelaran gelung mencipta pembolehubah i baharu dengan skop terhad kepada gelung:

<code class="js">for (let i = 0; i < 3; i++) {
  funcs[i] = function() {
    console.log("My value:", i);
  };
}</code>

ES5.1 Penyelesaian: forEach

Dalam persekitaran yang menyokong fungsi Array.prototype.forEach, kita boleh memanfaatkan sifat uniknya untuk mencipta penutupan yang berbeza bagi setiap lelaran. Fungsi panggil balik menerima elemen semasa tatasusunan sebagai parameter, memastikan setiap fungsi menangkap nilai unik:

<code class="js">var funcs = [];
[0, 1, 2].forEach(function(i) {
  funcs[i] = function() {
    console.log("My value:", i);
  };
});</code>

Penyelesaian Klasik: Penutupan

Klasik penyelesaian adalah untuk membuat penutupan yang mengikat pembolehubah kepada nilai tertentu di luar gelung. Ini dicapai dengan mengembalikan fungsi baharu yang menangkap nilai yang diingini:

<code class="js">for (var i = 0; i < 3; i++) {
  funcs[i] = (function(i) {
    return function() {
      console.log("My value:", i);
    };
  })(i);
}</code>

Dengan menghantar i sebagai hujah kepada fungsi dalaman, kami memastikan setiap penutupan menangkap nilai yang betul.

Atas ialah kandungan terperinci Apabila Menggunakan Penutupan dalam Gelung JavaScript, Bagaimanakah Anda Boleh Memastikan Setiap Penutupan Menangkap Nilai yang Betul?. 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