所以我知道setTimeout
和setInterval
之间存在差异,但考虑以下两个代码示例:
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
中,你只启动一次解析器/编译器。但这种差异应该无关紧要,因为你根本不应该这样做 —见下文.
但是撇开微妙之处不谈,这里的功能是一样的。
边注:将字符串传递给setTimeout
或setInterval
不是最佳实践。相反,传入一个函数引用:
// setTimeout
function myFunction(){
setTimeout(myFunction, 100);
doSomething();
}
setTimeout(myFunction, 100);
// setInterval
function myFunction(){
doSomething();
}
setInterval(myFunction, 100);
传入字符串会触发JavaScript解析器,并执行与eval
相同的操作。在任何可能的情况下都应该避免使用
让我们用一个非常大的超时时间来绘制差异:1天。您在第一天00:00调用这两个方法,并让它运行1年…
1年后,setInterval调用的方法将在00:00 +几毫秒执行(因为你可能不是唯一一个要求处理器在这个确切的时刻做事情的人,而且操作系统计时器无论如何都有粒度)。
但是你的setTimeout方法将在后面发生,可能在00:01左右,因为每天它都会在请求时间之后被调用,并请求在第二天的同一时间被调用…
PS:在某些情况下,它也可以在请求时间之前调用,但通常情况下它会在以下时间运行:-D