setTimeout或setInterval?

据我所知,这两个JavaScript的行为方式相同:

选项A:

function myTimeoutFunction()
{
    doStuff();
    setTimeout(myTimeoutFunction, 1000);
}

myTimeoutFunction();

选项B:

function myTimeoutFunction()
{
    doStuff();
}

myTimeoutFunction();
setInterval(myTimeoutFunction, 1000);

使用setTimeout和setInterval有什么区别吗?


他们基本上试图做同样的事情,但setInterval方法将比setTimeout方法更准确,因为setTimeout等待1000毫秒,运行该函数,然后设置另一个超时。 所以等待时间实际上超过了1000毫秒(或者如果你的功能需要很长时间才能执行)。

Altough人们可能认为setInterval将执行每正是 1000毫秒,一定要注意这一点很重要setInterval也将推迟,因为JavaScript是不是多线程的语言,这意味着-如果有脚本运行的其它部分-区间将不得不等待完成。

在这个小提琴中,您可以清楚地看到超时将落后,而时间间隔差不多每秒接近1次(脚本正在尝试这样做)。 如果将顶部的速度变量更改为20(如每秒运行50次),则间隔永远不会达到平均每秒50次迭代。

延迟几乎总是可以忽略的,但是如果你编写了一些非常精确的东西,你应该选择一个自我调整的定时器(本质上它是一个基于超时的定时器,不断调整自己以适应它所创建的延迟)


有什么区别吗?

是。 超时在setTimeout()被调用后执行一段时间; Interval会在上一个间隔开始后执行一定的时间。

如果您的doStuff()函数需要一段时间才能执行,您会注意到不同之处。 例如,如果我们代表对setTimeout / setInterval的调用. 与超时/间隔的点火*和JavaScript代码执行与[-----]时间线是这样的:

Timeout:

.    *  .    *  .    *  .    *  .
     [--]    [--]    [--]    [--]

Interval:

.    *    *    *    *    *    *
     [--] [--] [--] [--] [--] [--]

接下来的复杂情况是,如果JavaScript正在忙于做某事(例如处理以前的时间间隔),则触发间隔。 在这种情况下,间隔会被记住,并且只要前一个处理程序完成并将控制权返回给浏览器就会发生。 例如,对于有时短([ - ])和有时长([-----])的doStuff()进程:

.    *    *    •    *    •    *    *
     [-]  [-----][-][-----][-][-]  [-]

•表示间隔射击,无法立即执行其代码,而是被暂时取消。

所以间隔时间试图“赶上”按时返回。 但是,它们并不排在第一位:每个区间只能有一个挂起执行。 (如果他们全部排队,浏览器将留下一个不断扩大的未完成执行列表!)

.    *    •    •    x    •    •    x
     [------][------][------][------]

x代表无法执行或未完成的间隔触发,因此被丢弃。

如果您的doStuff()函数习惯性地花费比设置的间隔更长的时间执行,浏览器将尝试100%CPU尝试提供服务,并且响应速度可能会变慢。

你使用哪个,为什么?

链接超时为浏览器提供了保证的空闲时间插槽; Interval尝试确保其运行的功能尽可能接近其预定时间,但会牺牲浏览器UI的可用性。

我会考虑我希望尽可能平滑的一次性动画的时间间隔,而链接超时对于在页面加载时始终发生的正在进行的动画更有礼貌。 对于要求不高的用途(例如每30秒钟发射一次微小的更新),可以安全地使用其中一种。

在浏览器兼容性方面,setTimeout早于setInterval,但您今天将遇到的所有浏览器都支持这两种浏览器。 多年来的最后一个失败者是WinMo <6.5中的IE Mobile,但是也希望这一点在我们后面。


的setInterval()

setInterval()是基于时间间隔的代码执行方法,具有在达到间隔时重复运行指定脚本的本地功能。 它不应该被脚本作者嵌套到它的回调函数中,因为它默认循环的 。 除非调用clearInterval()否则它将继续在间隔内触发。

如果你想循环代码动画或时钟滴答,然后使用setInterval()

function doStuff() {
    alert("run your code here when time interval is reached");
}
var myTimer = setInterval(doStuff, 5000);

的setTimeout()

setTimeout()是将要执行的脚本只有一个到达间隔时间时基于时间的代码执行方法。 除非通过将setTimeout()对象嵌套到要调用的函数内部来运行,否则它不会再次重复循环。 如果调整为循环,除非调用clearTimeout() ,否则它将继续保持间隔。

function doStuff() {
    alert("run your code here when time interval is reached");
}
var myTimer = setTimeout(doStuff, 5000);

如果你想要在指定的时间段内发生一次,那么使用setTimeout() 。 这是因为它只在达到指定间隔时执行一次。

链接地址: http://www.djcxy.com/p/51607.html

上一篇: setTimeout or setInterval?

下一篇: Stop setInterval call in JavaScript