搜索

首页  >  问答  >  正文

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 = window.setTimeout(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的不一样?

















谢谢各位的回答哈。
伊谢尔伦伊谢尔伦2754 天前675

全部回复(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
  • 取消回复