Rumah >hujung hadapan web >tutorial js >Mengapa For-Loop dengan setTimeout Mencetak Nilai Tidak Dijangka?
Untuk Gelung Dibalut dalam setTimeout Mencetak Nilai Yang Tidak Dijangka
Dalam skrip ini, gelung untuk berulang dengan pembolehubah i daripada 1 hingga 2, dan dalam gelung, fungsi tamat masa ditetapkan dengan kelewatan 100 milisaat untuk memaklumkan nilai i apabila ia melaksanakan. Walau bagaimanapun, gelagat yang dijangkakan adalah untuk skrip mencetak 1 dan 2 berturut-turut, tetapi sebaliknya, 3 dimaklumkan dua kali.
Tingkah laku yang tidak dijangka berpunca daripada fakta bahawa i dikongsi sepanjang gelung dan diubah suai sebagai gelung maju. Apabila fungsi tamat masa dilaksanakan, saya telah pun mencapai 3, membawa kepada kedua-dua makluman memaparkan nilai tersebut.
Untuk menyelesaikan isu ini dan memastikan nilai cetakan berturut-turut, adalah perlu untuk membuat salinan berasingan bagi setiap fungsi tamat masa . Ini boleh dicapai dengan mentakrifkan fungsi khusus, doSetTimeout, yang mengambil i sebagai hujah dan menetapkan tamat masa menggunakan nilai khusus tersebut.
Skrip yang diubah suai menggunakan doSetTimeout adalah seperti berikut:
function doSetTimeout(i) { setTimeout(function() { alert(i); }, 100); } for (var i = 1; i <= 2; ++i) doSetTimeout(i);
Dengan pengubahsuaian ini, setiap lelaran gelung mencipta salinan baharu i yang dihantar ke doSetTimeout, memastikan setiap tamat masa dilaksanakan dengan nilai yang betul.
Atas ialah kandungan terperinci Mengapa For-Loop dengan setTimeout Mencetak Nilai Tidak Dijangka?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!