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!