Rumah > Soal Jawab > teks badan
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的不一样?
谢谢各位的回答哈。
PHPz2017-05-19 10:35:22
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
执行完后开始执行的。所以最后一个定时器被清除。其它定时器照常执行。
最后那个,while
执行的时候setTimeout
里的函数并没有被调用,因此j++
并没有执行,所以在循环体内j
一直是0
。
注:匿名函数只是作为一个参数被传入setTimeout
while
dilaksanakan, fungsi dalam setTimeout
tidak dipanggil, jadi j++
tidak dilaksanakan, jadi dalam badan gelung j
sentiasa 0
. setTimeout
sebagai parameter. 🎜高洛峰2017-05-19 10:35:22
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
滿天的星座2017-05-19 10:35:22
Oleh kerana semua setTimeout
dilaksanakan selepas clearTimeout(timer)
, yang kelima telah dikosongkan. setTimeout
是在clearTimeout(timer)
之后才开始执行的,已经把第五个清除掉了。
最后那个是因为while
执行的时候j
是0
,所有的setTimeout
都是延迟0
semasa
dilaksanakan, j
ialah 0
dan semua setTimeout
adalah kelewatan 0
Mulakan pelaksanaan selepas. 🎜过去多啦不再A梦2017-05-19 10:35:22
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)
迷茫2017-05-19 10:35:22
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.