var i = 0, timer, j = 0;
while(i++ < 5) {
timer = window.setTimeout(function(){
j++;
alert(j);
}, 1000);
}
clearTimeout(timer);
Die Ausgabe ist 1,2,3,4
Warum wird 5 nicht ausgegeben? Und warum wird es so ausgegeben? Weist er nicht jedes Mal Werte zu und überschreibt sie? Warum wird es immer noch ausgeführt? Wie lautet die Reihenfolge? Wann wird die Anweisung clearTimeout ausgeführt? Wenn Sie sie geringfügig ändern
var i = 0, timer, j = 0;
while(i++ < 5) {
timer = window.setTimeout(function(){
j++;
warning( j);
}, i*1000);
}
clearTimeout(timer);
Dies wird jede Sekunde ausgegeben. Wenn das obige Problem gelöst ist, ist nichts falsch
Ändern Sie weiter
var i = 0, timer, j = 0;
while(i++ < 5) {
timer = window.setTimeout(function(){
j++;
alert(j);
}, j*1000);
}
clearTimeout(timer);
这个时候,他是同时输出的,为什么跟上面用i的不一样?
谢谢各位的回答哈。
首先,循环体内创建了5个定时器,每个定时器有各自的ID,ID在调用
setTimeout
时被返回,是一个数值。其次,
timer
只是保存定时器的ID,并不会修改定时器的ID,所以当循环结束时,timer
只是保存了最后一个定时器的ID。赋值覆盖的是什么应该清楚了吧。定时器里的函数是在
clearTimeout
执行完后开始执行的。所以最后一个定时器被清除。其它定时器照常执行。最后那个,
while
执行的时候setTimeout
里的函数并没有被调用,因此j++
并没有执行,所以在循环体内j
一直是0
。注:匿名函数只是作为一个参数被传入
setTimeout
函数中。第一问,当i=4时,本应该过1秒钟再alert(j==5)的,但是接下来立马执行了clearTimeout(timer)取消了alert(j)
第二问同上
第三问,当i=0时,j为0,这里你可能认为会直接执行alert操作,但事实却不是,setTimeout(code,millisec)是把code放到一个等待队列中后面再执行,所以当i=1时j还是0,同理i=2,3,4,5,所以会连续输出1234
因为所有的
setTimeout
是在clearTimeout(timer)
之后才开始执行的,已经把第五个清除掉了。最后那个是因为
while
执行的时候j
是0
,所有的setTimeout
都是延迟0
后开始执行。好好看看这个 while(i++ < 5) 为什么不能输出5 因为不比5大所以不输出. 解决办法 while(i++ <= 5)
就回答第一个吧,因为setTimeout是异步执行的,所以clearTimeout(timer)会清空第一个定时器。也就是说当i=0时不会alert出来,j也没有执行j++,j还是等于0的。过了一秒钟,再次生成定时器,这时i=1,j=0,由于后面的clearTimeout(timer)是同步执行,所以不再清空定时器,这样就看到了你现在的结果