検索

ホームページ  >  に質問  >  本文

javascript - jsの非同期の問題、settimeoutの問題

リーリー

出力は 1,2,3,4 です
5 出力されないのはなぜですか?そして、なぜこのように出力されるのでしょうか?毎回値を割り当てて上書きしていませんか?なぜまだ実行されているのでしょうか?順番は何ですか? clearTimeout ステートメントはいつ実行されますか?
少し変更すると、
var i = 0, timer, j = 0;
while(i < 5) {
timer = window.setTimeout( function) (){
j ;
alert(j);
}, i*1000);
}
clearTimeout(timer);
これは、上記の場合、毎秒出力することを意味します。問題が解決したら何も問題はありません
引き続き変更を続けます

リーリー
伊谢尔伦伊谢尔伦2755日前677

全員に返信(5)返信します

  • PHPz

    PHPz2017-05-19 10:35:22

    まず、ループ本体内に 5 つのタイマーが作成されます。各タイマーは、呼び出し setTimeout时被返回,是一个数值。
    其次,timer只是保存定时器的ID,并不会修改定时器的ID,所以当循环结束时,timer只是保存了最后一个定时器的ID。赋值覆盖的是什么应该清楚了吧。
    定时器里的函数是在clearTimeout が実行された後に実行を開始します。したがって、最後のタイマーはクリアされます。他のタイマーは通常どおり実行されます。

    最後に、while执行的时候setTimeout里的函数并没有被调用,因此j++并没有执行,所以在循环体内j一直是0
    注:匿名函数只是作为一个参数被传入setTimeout関数内です。

    返事
    0
  • 高洛峰

    高洛峰2017-05-19 10:35:22

    最初の質問、i=4の場合、1秒後にalert(j==5)が発生するはずですが、すぐにclearTimeout(timer)が実行されてalert(j)がキャンセルされました

    2番目の質問は上記と同じです

    3 番目の質問、i=0、j が 0 の場合、アラート操作が直接実行されると思われるかもしれませんが、setTimeout(code, millisec) はコードを待機キューに入れてから実行します。 i=1のときはjは0のままです。同様にi=2,3,4,5なので1234が連続して出力されます

    返事
    0
  • 滿天的星座

    滿天的星座2017-05-19 10:35:22

    は全て後から実行したため、5つ目は既にクリアされています。 setTimeout是在clearTimeout(timer)

    最後のものは

    の後に実行されます。 while执行的时候j0,所有的setTimeout都是延迟0

    返事
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-19 10:35:22

    この while(i++ <5) が 5 より大きくないために 5 を出力できない理由をよく見てください。解決策 while(i++ <= 5)

    返事
    0
  • 迷茫

    迷茫2017-05-19 10:35:22

    最初の質問に答えましょう。setTimeout は非同期で実行されるため、clearTimeout(timer) は最初のタイマーをクリアします。つまり、i=0 の場合、アラートは出力されず、j は j++ を実行しておらず、j は 0 のままです。 1秒後、再びタイマーが生成され、i=1、j=0となります。後続のclearTimeout(timer)は同期的に実行されるため、タイマーはクリアされなくなり、現在の結果が表示されます。

    返事
    0
  • キャンセル返事