var i = 0, timer, j = 0;
while(i++ < 5) {
timer = window.setTimeout(function(){
j++;
alert(j);
}, 1000);
}
clearTimeout(timer);
Keluaran ialah 1,2,3,4
Mengapa 5 bukan keluaran? Dan mengapa ia keluaran seperti ini? Tidakkah dia memberikan nilai dan menimpanya setiap kali? Mengapa ia masih dilaksanakan? Apakah pesanan? Bilakah pernyataan clearTimeout dilaksanakan? Jika anda menukarnya sedikit
var i = 0, pemasa, j = 0;
while(i++ < 5) {
timer = window.setTimeout(function(){
j++;
alert( j);
}, i*1000);
}
clearTimeout(timer);
Ini adalah output setiap saat.Jika masalah di atas selesai, maka tiada salahnya
Teruskan perubahan
var i = 0, timer, j = 0;
while(i++ < 5) {
timer = window.setTimeout(function(){
j++;
alert(j);
}, j*1000);
}
clearTimeout(timer);
这个时候,他是同时输出的,为什么跟上面用i的不一样?
谢谢各位的回答哈。
Pertama, 5 pemasa dibuat dalam badan gelung Setiap pemasa mempunyai IDnya sendiri apabila memanggil
setTimeout
dan merupakan nilai berangka.Kedua,
pemasa
hanya menyimpan ID pemasa dan tidak mengubah suai ID pemasa, jadi apabila gelung tamat,pemasa
hanya menyimpan ID pemasa terakhir. Ia harus jelas apa yang meliputi tugasan.Fungsi dalam pemasa mula dilaksanakan selepas
clearTimeout
dilaksanakan. Jadi pemasa terakhir dikosongkan. Pemasa lain dilaksanakan seperti biasa.setTimeout
时被返回,是一个数值。其次,
timer
只是保存定时器的ID,并不会修改定时器的ID,所以当循环结束时,timer
只是保存了最后一个定时器的ID。赋值覆盖的是什么应该清楚了吧。定时器里的函数是在
clearTimeout
执行完后开始执行的。所以最后一个定时器被清除。其它定时器照常执行。最后那个,
Yang terakhir, apabilawhile
执行的时候setTimeout
里的函数并没有被调用,因此j++
并没有执行,所以在循环体内j
一直是0
。注:匿名函数只是作为一个参数被传入
setTimeout
while
dilaksanakan, fungsi dalamsetTimeout
tidak dipanggil, jadij++
tidak dilaksanakan, jadi dalam badan gelungj
sentiasa0
.Nota: Fungsi tanpa nama hanya dihantar ke dalam fungsi
setTimeout
sebagai parameter. 🎜Soalan pertama, apabila i=4, ia sepatutnya mempunyai amaran(j==5) selepas 1 saat, tetapi kemudian clearTimeout(pemasa) telah dilaksanakan serta-merta untuk membatalkan amaran(j)
Soalan kedua sama seperti di atas
Soalan ketiga ialah, apabila i=0, j ialah 0. Anda mungkin berfikir bahawa operasi amaran akan dilaksanakan secara langsung, tetapi tidak demikian halnya setTimeout(code, millisec) meletakkan kod ke dalam baris gilir menunggu dan kemudian melaksanakan ia kemudian, jadi Apabila i=1, j masih 0. Begitu juga, i=2,3,4,5, jadi 1234 akan dikeluarkan secara berterusan
Oleh kerana semua
setTimeout
dilaksanakan selepasclearTimeout(timer)
, yang kelima telah dikosongkan.setTimeout
是在clearTimeout(timer)
之后才开始执行的,已经把第五个清除掉了。最后那个是因为
Yang terakhir adalah kerana apabilawhile
执行的时候j
是0
,所有的setTimeout
都是延迟0
semasa
dilaksanakan,j
ialah0
dan semuasetTimeout
adalah kelewatan0
Mulakan pelaksanaan selepas. 🎜Lihat baik-baik pada while(i++ < 5) ini mengapa ia tidak boleh mengeluarkan 5 kerana ia tidak lebih besar daripada 5. Penyelesaian while(i++ <= 5)
Mari jawab yang pertama, kerana setTimeout dilaksanakan secara tidak segerak, jadi clearTimeout(pemasa) akan mengosongkan pemasa pertama. Maksudnya, apabila i=0, amaran tidak akan keluar, j belum melaksanakan j++, dan j masih sama dengan 0. Selepas satu saat, pemasa dijana semula Pada masa ini, i=1,j=0 Memandangkan clearTimeout(pemasa) seterusnya dilaksanakan secara serentak, pemasa tidak lagi dikosongkan, jadi anda boleh melihat hasil semasa anda.