javascript - masalah asynchronous js, masalah settimeout
伊谢尔伦
伊谢尔伦 2017-05-19 10:33:22
0
5
662
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的不一样?

















谢谢各位的回答哈。
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

membalas semua(5)
PHPzhong

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

Yang terakhir, apabila while dilaksanakan, fungsi dalam setTimeout tidak dipanggil, jadi j++ tidak dilaksanakan, jadi dalam badan gelung j sentiasa 0.
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 selepas clearTimeout(timer), yang kelima telah dikosongkan. setTimeout是在clearTimeout(timer)之后才开始执行的,已经把第五个清除掉了。

最后那个是因为while执行的时候j0,所有的setTimeout都是延迟0

Yang terakhir adalah kerana apabila semasa dilaksanakan, j ialah 0 dan semua setTimeout adalah kelewatan 0Mulakan pelaksanaan selepas. 🎜
过去多啦不再A梦

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan