出力は 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);
これは、上記の場合、毎秒出力することを意味します。問題が解決したら何も問題はありません
引き続き変更を続けます
まず、ループ本体内に 5 つのタイマーが作成されます。各タイマーは、呼び出し
setTimeout
时被返回,是一个数值。其次,
timer
只是保存定时器的ID,并不会修改定时器的ID,所以当循环结束时,timer
只是保存了最后一个定时器的ID。赋值覆盖的是什么应该清楚了吧。定时器里的函数是在
clearTimeout
が実行された後に実行を開始します。したがって、最後のタイマーはクリアされます。他のタイマーは通常どおり実行されます。最後に、
while
执行的时候setTimeout
里的函数并没有被调用,因此j++
并没有执行,所以在循环体内j
一直是0
。注:匿名函数只是作为一个参数被传入
setTimeout
関数内です。最初の質問、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が連続して出力されます
は全て後から実行したため、5つ目は既にクリアされています。
最後のものはsetTimeout
是在clearTimeout(timer)
の後に実行されます。
while
执行的时候j
是0
,所有的setTimeout
都是延迟0
この while(i++
最初の質問に答えましょう。setTimeout は非同期で実行されるため、clearTimeout(timer) は最初のタイマーをクリアします。つまり、i=0 の場合、アラートは出力されず、j は j++ を実行しておらず、j は 0 のままです。 1秒後、再びタイマーが生成され、i=1、j=0となります。後続のclearTimeout(timer)は同期的に実行されるため、タイマーはクリアされなくなり、現在の結果が表示されます。