再次设置setTimeout与setInterval

时间:2011-10-26 08:21:35

标签: javascript settimeout setinterval

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

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

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

请注意,在第一个示例中,我在函数开头调用setTimeout,然后调用doSomething。因此doSomething()没有额外的延迟。这是否意味着这两个例子完全相同?或者是否有更微妙的差异?

2 个答案:

答案 0 :(得分:11)

它们在功能上大致相同,但存在差异。一个区别在于,如果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相同的操作。应该尽可能避免(并且几乎总是可能的)。

答案 1 :(得分:1)

T.J。克劳德解释了主要的差异,另一个更微妙的可能出现(我改变时间尺度,因为它更容易解释):

让我们用非常大的超时时间绘制差异:1天。你可以在第1天00:00调用这两种方法,让它运行1年......

1年后,setInterval调用的方法将在00:00 +几毫秒执行(因为您可能不是唯一一个要求处理器在此时刻执行操作且OS计时器无论如何都具有粒度的人)。 / p>

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

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