Javascript 这两个代码块之间关于setTimeout问题的差异
我这里有两个代码块: 区块1:Javascript 这两个代码块之间关于setTimeout问题的差异,javascript,settimeout,Javascript,Settimeout,我这里有两个代码块: 区块1: setTimeout(function(){ func1(); setTimeout(function(){ func2(); },500); },500); 区块2: setTimeout(function(){ func1(); },500); setTimeout(function(){ func2(); },1000); 这两个块之间的区别是什么?(不仅是结果,还有执行过程)在
setTimeout(function(){
func1();
setTimeout(function(){
func2();
},500);
},500);
区块2:
setTimeout(function(){
func1();
},500);
setTimeout(function(){
func2();
},1000);
这两个块之间的区别是什么?(不仅是结果,还有执行过程)在您的比较中,第一个块中的
func2()
将稍后调用,然后在第二个块中调用。为什么?因为它首先执行func1()
,然后触发新的setTimeout()
计时器
// First scenario:
setTimeout()
*---------*----------*===*
500 1000
Func1()
*--*
setTimeout()
*-----------*
500
Func2()
*-*
// Second scenario:
setTimeout()
*---------*----------*
500 1000
Func1() Func2()
*-* *-*
在大多数情况下,差异将是最小的。但这取决于您在func1()
中执行的操作。该函数的执行时间将第二个超时推到第一个setTimeout()
的较后时间点
在执行、计时器和其他方面,我去年在柏林的jsConf上看到了一个有趣的深入讨论,关于javascript引擎如何在表面下工作,涉及调用堆栈、回调、异步请求等。我们花了25分钟
只有细微的差别。总的来说,你通常不会注意到任何不同
在第一个代码块中,第二个计时器在
func1
运行后启动,因此计时将取决于运行所需的时间。如果您这样编写块1,代码块的行为将更为相似:
setTimeout(function(){
setTimeout(function(){
func2();
},500);
func1();
},500);
然而,在时间上仍然会有细微的差别。如果在触发计时器时浏览器正忙于运行某些代码,则回调的执行将延迟到该代码完成。第一个计时器的任何延迟都会影响第二个计时器的启动时间
另一个区别是如果你想停止计时器。在block 1中,第二个计时器取决于第一个计时器,因此不能单独停止它们。停止第一个计时器也会停止第二个计时器,第二个计时器只能在第一个计时器完成后停止 使用块2,您可以在任何时间独立停止任一计时器。
setTimeout
方法返回一个句柄,如果要停止该句柄,将使用该句柄:
var handle1 = setTimeout(function(){
func1();
},500);
var handle2 = setTimeout(function(){
func2();
},1000);
然后,您可以使用
clearTimeout(handle1)
和clearTimeout(handle2)
停止任一计时器。除非func1需要很长时间才能启动,否则所感知到的情况不会有任何差异。如果不是,两个都将在半秒后运行func1,在1秒后运行func2。我想补充一点,JavaScript计时器不精确!非常感谢。当我的声誉达到15岁时,我会回来给你投票~~~