Rumah >hujung hadapan web >tutorial js >Mengapakah Nested `setTimeout` dalam JavaScript `for` Gelung Mencetak Nilai Tidak Berturut-turut?

Mengapakah Nested `setTimeout` dalam JavaScript `for` Gelung Mencetak Nilai Tidak Berturut-turut?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-15 15:32:14853semak imbas

Why Does Nested `setTimeout` in a JavaScript `for` Loop Print Non-Consecutive Values?

Memahami Isu: Pencetakan Nilai Tidak Berturut-turut dalam setTimeout Bersarang dalam for-Loop

Dalam JavaScript, fungsi tak segerak seperti setTimeout menjadualkan panggilan balik untuk melaksanakan selepas kelewatan. Apabila diletakkan dalam gelung, ini boleh membawa kepada tingkah laku yang tidak dijangka di mana pembolehubah yang diakses oleh panggil balik mungkin tidak segerak dengan keadaan gelung.

Contoh: Memaklumkan Nilai Salah

Pertimbangkan skrip yang disediakan:

for (var i = 1; i <= 2; i++) {
    setTimeout(function() { alert(i) }, 100);
}

Kod ini bertujuan untuk memaklumkan nilai 1 dan 2 berturut-turut, tetapi sebaliknya mengeluarkan 3 dua kali. Sebabnya terletak pada sifat tak segerak setTimeout, yang mencipta panggilan balik yang merujuk nilai semasa i.

Melalui i Tanpa Rentetan Fungsi

Untuk menangani isu ini dan memastikan pencetakan nilai berturut-turut, kita perlu mencipta contoh i yang berbeza untuk setiap panggilan balik setTimeout. Berikut ialah penyelesaian:

function doSetTimeout(i) {
  setTimeout(function() {
    alert(i);
  }, 100);
}

for (var i = 1; i <= 2; ++i)
  doSetTimeout(i);

Dengan mencipta fungsi eksplisit untuk setiap panggilan balik dan menghantar i sebagai hujah, kami mencipta salinan berasingan i untuk setiap lelaran gelung. Ini membolehkan panggilan balik merujuk nilai yang betul bagi i apabila dilaksanakan, memastikan pencetakan 1 dan 2 berturut-turut.

Atas ialah kandungan terperinci Mengapakah Nested `setTimeout` dalam JavaScript `for` Gelung Mencetak Nilai Tidak Berturut-turut?. 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