Javascript 这两个代码块之间关于setTimeout问题的差异

Javascript 这两个代码块之间关于setTimeout问题的差异,javascript,settimeout,Javascript,Settimeout,我这里有两个代码块: 区块1: setTimeout(function(){ func1(); setTimeout(function(){ func2(); },500); },500); 区块2: setTimeout(function(){ func1(); },500); setTimeout(function(){ func2(); },1000); 这两个块之间的区别是什么?(不仅是结果,还有执行过程)在

我这里有两个代码块:

区块1:

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岁时,我会回来给你投票~~~