也许这是一个先进后出的堆栈:对于同一个cpu时刻内推入定时器的队列(并且动作的定时间隔相同的才推入同一个堆栈),则下一次执行的顺序会倒过来:setInterval("producer()", pspeed);
setInterval("consumer()", cspeed);>>>>>
producer();
consumer();consumer();
producer();producer();
consumer();consumer();
producer();...........仅仅是猜测,没有找到切实证据,呵呵
setInterval("consumer()", cspeed);>>>>>
producer();
consumer();consumer();
producer();producer();
consumer();consumer();
producer();...........仅仅是猜测,没有找到切实证据,呵呵
push producer(2) 进定时队列
push producer(3) 进定时队列
pop producer(3)
执行producer(3)
push producer(3) //为了下次定时pop producer(2)
执行producer(2)
push producer(2) //为了下次定时pop producer(1)
执行producer(1)
push producer(1) //为了下次定时//以上存属于猜测
setInterval("producer(1)",1000);
setInterval("producer(2)",1000);
for(j=0;j<10000;j++);
setInterval("producer(3)",1000);
这样几个setInterval设定的时间就有先后了
<script>
function producer(i)
{
d.innerHTML = d.innerHTML + i + "<br/>";
}
setInterval("producer(1)",1000);
setInterval("producer(2)",1000);
for(j=0;j<5;j++);
setInterval("producer(" + j + ")",1000);</script>//看看这个,好像被优化掉了
//依然是猜测:d
——可能自己英文太差,他没看懂我说的意思?(@#$@!&^&RW@#1!41@^*^(&)%^$)
每回都是找完成操作的寄存器操控制的.间隔时间最短的操作,优先级别越高.
例如第一种情况,程序顺序执行,所以会出现1 2 3 3 2 1 的情况.例如一下问题,第一回顺序执行,for循环,第一回起到耽误时间作用,以后没
有在执行过,这个for循环拖延的时间,超过了1000,在职行的过程中,寄存器
已经都把setInterval("producer(2)",1000);与setInterval("producer(1)",1000);
放到进程队列中了,等待空闲马上执行,所以就出现和上一程序不一样的操作.
出现 1 2 3 2 1 3
和上面两个都无关了,他们虽然都是相隔1000,但是起点不同,所以不需要堆栈
1,2因为触发的起点相近,间隔都是一样的,导致他们起点间隔的那段时间无法执行完1,所以先把2压入堆栈
感觉 ttyp(愿赌服输) 说得这个原因还是比较合理的!
手册上怎么不说?哼!如果真得需要间隔时间相同的多个setInterval(),把执行体或函数一起写进第一个参数,分号分隔吧!这样比较容易理解和“控制”。我就说这个问题没有什么使用价值,呵呵。谢谢大家参与!结贴了!
——个人感觉这个问题的确理论价值比实用价值大太多,呵呵。不过我们还是有兴趣。
他的回答还真是明确:
1、他不知道IE是如何实现setInterval()的,但不同的浏览器甚至不同的版本,实现方法可能改变(言外之意是这个问题没有实际意义)。
2、不应该像这样使用setInterval(),完全是自找麻烦。
——虽然这样的回答让我不满意,不过我还是回信向他表示感谢了。外国人都那么实际?