Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
605 views
in Technique[技术] by (71.8m points)

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

















谢谢各位的回答哈。

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

首先,循环体内创建了5个定时器,每个定时器有各自的ID,ID在调用setTimeout时被返回,是一个数值。
其次,timer只是保存定时器的ID,并不会修改定时器的ID,所以当循环结束时,timer只是保存了最后一个定时器的ID。赋值覆盖的是什么应该清楚了吧。
定时器里的函数是在clearTimeout执行完后开始执行的。所以最后一个定时器被清除。其它定时器照常执行。

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
...