所以我知道setTimeout
和setInterval
之间存在差异,但请考虑以下两个代码示例:
function myFunction(){
setTimeout('myFunction();', 100);
doSomething();
}
setTimeout('myFunction();', 100);
和
function myFunction(){
doSomething();
}
setInterval('myFunction();', 100);
请注意,在第一个示例中,我在函数开头调用setTimeout
,然后调用doSomething
。因此doSomething()
没有额外的延迟。这是否意味着这两个例子完全相同?或者是否有更微妙的差异?
答案 0 :(得分:11)
它们在功能上大致相同,但存在差异。一个区别在于,如果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 :(得分:1)
T.J。克劳德解释了主要的差异,另一个更微妙的可能出现(我改变时间尺度,因为它更容易解释):
让我们用非常大的超时时间绘制差异:1天。你可以在第1天00:00调用这两种方法,让它运行1年......
1年后,setInterval调用的方法将在00:00 +几毫秒执行(因为您可能不是唯一一个要求处理器在此时刻执行操作且OS计时器无论如何都具有粒度的人)。 / p>
但是你的setTimeout方法会在后面发生,可能在00:01左右,因为每天它会在请求的时间之后稍微被调用,并要求在第二天同时调用...
PS:在某些情况下也可以在请求的时间之前调用它,但通常会在以下情况之后运行:-D