javascript - js 異步的問題,settimeout的問題
伊谢尔伦
伊谢尔伦 2017-05-19 10:33:22
0
5
664
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的不一样?

















谢谢各位的回答哈。
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回覆(5)
PHPzhong

首先,循環體內創建了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执行的时候j0,所有的setTimeout都是延迟0後才開始執行。

过去多啦不再A梦

好好看看這個 while(i++

迷茫

就回答第一個吧,因為setTimeout是非同步執行的,所以clearTimeout(timer)會清空第一個計時器。也就是說i=0時不會alert出來,j也沒有執行j++,j還是等於0的。過了一秒鐘,再次產生定時器,這時i=1,j=0,由於後面的clearTimeout(timer)是同步執行,所以不再清空定時器,這樣就看到了你現在的結果

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板