var?i?=?0,?timer,?j?=?0;
while(i++?<?5)?{
??timer?=?window.setTimeout(function(){
????j++;
????alert(j);
??},?1000);
}
clearTimeout(timer);
輸出的是1,2,3,4
5怎麼沒(méi)輸出?還有為什麼是這樣輸出的?他不是每次都賦值覆蓋了嗎?怎麼還會(huì)執(zhí)行?順序是什麼? clearTimeout這語(yǔ)句是在什麼時(shí)候執(zhí)行的
如果稍微改下
var?i?=?0,?timer,?j?=?0;
while(i ?<?5)?{
??timer?=?. function(){
????j ;
????alert(j);
??},?i*1000);
}
clearTimeout(timer);
#這樣就是每隔一秒輸出,如果上面的問(wèn)題解決了,那麼沒(méi)毛病
再繼續(xù)改
var?i?=?0,?timer,?j?=?0;
while(i++?<?5)?{
??timer?=?window.setTimeout(function(){
????j++;
????alert(j);
??},?j*1000);
}
clearTimeout(timer);
這個(gè)時(shí)候,他是同時(shí)輸出的,為什么跟上面用i的不一樣?
謝謝各位的回答哈。
小伙看你根骨奇佳,潛力無(wú)限,來(lái)學(xué)PHP伐。
首先,循環(huán)體內(nèi)創(chuàng)建了5個(gè)定時(shí)器,每個(gè)定時(shí)器有各自的ID,ID在呼叫setTimeout
時(shí)被返回,是一個(gè)數(shù)值。
其次,timer
只是保存定時(shí)器的ID,并不會(huì)修改定時(shí)器的ID,所以當(dāng)循環(huán)結(jié)束時(shí),timer
只是保存了最后一個(gè)定時(shí)器的ID。賦值覆蓋的是什么應(yīng)該清楚了吧。
定時(shí)器里的函數(shù)是在clearTimeout
執(zhí)行完後開(kāi)始執(zhí)行的。所以最後一個(gè)定時(shí)器被清除。其它定時(shí)器照常執(zhí)行。
最後那個(gè),while
執(zhí)行的時(shí)候setTimeout
里的函數(shù)并沒(méi)有被調(diào)用,因此j++
并沒(méi)有執(zhí)行,所以在循環(huán)體內(nèi)j
一直是0
。
注:匿名函數(shù)只是作為一個(gè)參數(shù)被傳入setTimeout
函數(shù)中。
第一問(wèn),當(dāng)i=4時(shí),本來(lái)應(yīng)該過(guò)1秒鐘再alert(j==5)的,但是接下來(lái)立刻執(zhí)行了clearTimeout(timer)取消了alert(j)
第二問(wèn)同上
第三問(wèn),當(dāng)i=0時(shí),j為0,這裡你可能認(rèn)為會(huì)直接執(zhí)行alert操作,但事實(shí)卻不是,setTimeout(code,millisec)是把code放到一個(gè)等待隊(duì)列中後面再執(zhí)行,所以當(dāng)i=1時(shí)j還是0,同理i=2,3,4,5,所以會(huì)連續(xù)輸出1234
因?yàn)樗械?code>setTimeout是在clearTimeout(timer)
之後才開(kāi)始執(zhí)行的,已經(jīng)把第五個(gè)清除掉了。
最後那個(gè)是因?yàn)?code>while執(zhí)行的時(shí)候j
是0
,所有的setTimeout
都是延遲0
後才開(kāi)始執(zhí)行。
就回答第一個(gè)吧,因?yàn)閟etTimeout是非同步執(zhí)行的,所以clearTimeout(timer)會(huì)清空第一個(gè)計(jì)時(shí)器。也就是說(shuō)i=0時(shí)不會(huì)alert出來(lái),j也沒(méi)有執(zhí)行j++,j還是等於0的。過(guò)了一秒鐘,再次產(chǎn)生定時(shí)器,這時(shí)i=1,j=0,由於後面的clearTimeout(timer)是同步執(zhí)行,所以不再清空定時(shí)器,這樣就看到了你現(xiàn)在的結(jié)果