setTimeout vs setInterval again

setTimeout vs setInterval again

本文关键字:again setInterval vs setTimeout      更新时间:2023-09-26

所以我知道setTimeoutsetInterval之间存在差异,但考虑以下两个代码示例:

function myFunction(){
   setTimeout('myFunction();', 100);
   doSomething();
}
setTimeout('myFunction();', 100);

function myFunction(){
   doSomething();
}
setInterval('myFunction();', 100);

注意,在第一个例子中,我在函数开始时调用setTimeout,然后调用doSomething。因此,doSomething()没有额外的延迟。这是否意味着这两个例子完全一样呢?还是有更微妙的区别?

它们在功能上大致相同,但有区别。一个不同之处在于,如果doSomething花费的时间超过时间间隔,浏览器将如何处理它。对于setInterval,如果doSomething仍在运行,至少一些浏览器将跳过下一个间隔。因此,如果您使用100毫秒,而doSomething需要110毫秒才能运行,那么下一次运行将在90毫秒之后发生(当然,所有这些时间都是近似值)。

另一个区别是,setTimeout每次都会得到一个新的句柄,而setInterval每次只得到一个句柄。

另一个不同之处在于,在setTimeout的例子中,你每次都启动一个JavaScript解析器/编译器,而在setInterval中,你只启动一次解析器/编译器。但这种差异应该无关紧要,因为你根本不应该这样做 —见下文.

但是撇开微妙之处不谈,这里的功能是一样的。


边注:将字符串传递给setTimeoutsetInterval不是最佳实践。相反,传入一个函数引用:

// setTimeout
function myFunction(){
   setTimeout(myFunction, 100);
   doSomething();
}
setTimeout(myFunction, 100);
// setInterval
function myFunction(){
   doSomething();
}
setInterval(myFunction, 100);

传入字符串会触发JavaScript解析器,并执行与eval相同的操作。在任何可能的情况下都应该避免使用

<p克劳德解释了主要的区别,另一个更微妙的可能出现(我改变了时间尺度,因为它更容易解释):>

让我们用一个非常大的超时时间来绘制差异:1天。您在第一天00:00调用这两个方法,并让它运行1年…

1年后,setInterval调用的方法将在00:00 +几毫秒执行(因为你可能不是唯一一个要求处理器在这个确切的时刻做事情的人,而且操作系统计时器无论如何都有粒度)。

但是你的setTimeout方法将在后面发生,可能在00:01左右,因为每天它都会在请求时间之后被调用,并请求在第二天的同一时间被调用…

PS:在某些情况下,它也可以在请求时间之前调用,但通常情况下它会在以下时间运行:-D