var i = 0, timer, j = 0;
while(i++ < 5) {
timer = window.setTimeout(function(){
j++;
alert(j);
}, 1000);
}
clearTimeout(timer);
輸出的是1,2,3,4
5怎麼沒輸出?還有為什麼是這樣輸出的?他不是每次都賦值覆蓋了嗎?怎麼還會執行?順序是什麼? clearTimeout這語句是在什麼時候執行的
如果稍微改下
var i = 0, timer, j = 0;
while(i < 5) {
timer = . function(){
j ;
alert(j);
}, i*1000);
}
clearTimeout(timer);
#這樣就是每隔一秒輸出,如果上面的問題解決了,那麼沒毛病
再繼續改
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++
就回答第一個吧,因為setTimeout是非同步執行的,所以clearTimeout(timer)會清空第一個計時器。也就是說i=0時不會alert出來,j也沒有執行j++,j還是等於0的。過了一秒鐘,再次產生定時器,這時i=1,j=0,由於後面的clearTimeout(timer)是同步執行,所以不再清空定時器,這樣就看到了你現在的結果