搜尋

首頁  >  問答  >  主體

javascript - js 異步的問題,settimeout的問題

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的不一样?

















谢谢各位的回答哈。
伊谢尔伦伊谢尔伦2755 天前678

全部回覆(5)我來回復

  • PHPz

    PHPz2017-05-19 10:35:22

    首先,循環體內創建了5個定時器,每個定時器有各自的ID,ID在呼叫setTimeout时被返回,是一个数值。
    其次,timer只是保存定时器的ID,并不会修改定时器的ID,所以当循环结束时,timer只是保存了最后一个定时器的ID。赋值覆盖的是什么应该清楚了吧。
    定时器里的函数是在clearTimeout執行完後開始執行的。所以最後一個定時器被清除。其它定時器照常執行。

    最後那個,while执行的时候setTimeout里的函数并没有被调用,因此j++并没有执行,所以在循环体内j一直是0
    注:匿名函数只是作为一个参数被传入setTimeout函數中。

    回覆
    0
  • 高洛峰

    高洛峰2017-05-19 10:35:22

    第一問,當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

    回覆
    0
  • 滿天的星座

    滿天的星座2017-05-19 10:35:22

    因為所有的setTimeout是在clearTimeout(timer)之後才開始執行的,已經把第五個清除掉了。

    最後那個是因為while执行的时候j0,所有的setTimeout都是延迟0後才開始執行。

    回覆
    0
  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-19 10:35:22

    好好看看這個 while(i++ < 5) 為什麼不能輸出5 因為不比5大所以不輸出. 解 while(i++ <= 5)

    回覆
    0
  • 迷茫

    迷茫2017-05-19 10:35:22

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

    回覆
    0
  • 取消回覆