Javascript – asynchrones JS-Problem, Settimeout-Problem
伊谢尔伦
伊谢尔伦 2017-05-19 10:33:22
0
5
670
var i = 0, timer, j = 0;
while(i++ < 5) {
  timer = window.setTimeout(function(){
    j++;
    alert(j);
  }, 1000);
}
clearTimeout(timer);

Die Ausgabe ist 1,2,3,4
Warum wird 5 nicht ausgegeben? Und warum wird es so ausgegeben? Weist er nicht jedes Mal Werte zu und überschreibt sie? Warum wird es immer noch ausgeführt? Wie lautet die Reihenfolge? Wann wird die Anweisung clearTimeout ausgeführt? Wenn Sie sie geringfügig ändern
var i = 0, timer, j = 0;
while(i++ < 5) {
timer = window.setTimeout(function(){
j++;
warning( j);
}, i*1000);
}
clearTimeout(timer);
Dies wird jede Sekunde ausgegeben. Wenn das obige Problem gelöst ist, ist nichts falsch
Ändern Sie weiter

    var i = 0, timer, j = 0;
    while(i++ < 5) {
      timer = window.setTimeout(function(){
        j++;
        alert(j);
      }, j*1000);
    }

clearTimeout(timer);
这个时候,他是同时输出的,为什么跟上面用i的不一样?

















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

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

Antworte allen(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++ < 5) 为什么不能输出5 因为不比5大所以不输出. 解决办法 while(i++ <= 5)

迷茫

就回答第一个吧,因为setTimeout是异步执行的,所以clearTimeout(timer)会清空第一个定时器。也就是说当i=0时不会alert出来,j也没有执行j++,j还是等于0的。过了一秒钟,再次生成定时器,这时i=1,j=0,由于后面的clearTimeout(timer)是同步执行,所以不再清空定时器,这样就看到了你现在的结果

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage