有什么区别吗?
有。Timeout会在setTimeout()调用一定时间后执行;而Interval会在上一个interval触发一定时间后执行。
如果您的doStuff()函数需要执行一段时间,您将会注意到它们之间的区别。例如,如果我们用.
表示setTimeout/setInterval的调用,用*
表示timeout/interval的触发,用[-----]
表示JavaScript代码执行,则时间线如下所示:
Timeout:
. * . * . * . * .
[--] [--] [--] [--]
Interval:
. * * * * * *
[--] [--] [--] [--] [--] [--]
下一个问题是如果在 JavaScript 已经忙于处理先前的间隔(例如处理上一个间隔)时,一个间隔触发了。在这种情况下,该间隔将被记住,并在前一个处理程序完成并将控制返回到浏览器后立即发生。因此,例如对于一个有时很短([-])有时很长([-----])的 doStuff() 过程:
. * * • * • * *
[-] [-----][-][-----][-][-] [-]
• 表示一个间隔触发器不能立即执行其代码,而是被挂起。
因此,间隔触发器尝试“赶上”以重新回到预定时间表。但是,它们不会在彼此之上排队:每个间隔触发器一次只能有一个等待执行的任务。(如果它们都排队等候,浏览器将面临一个不断扩大的未完成任务列表!)
. * • • x • • x
[------][------][------][------]
x代表一个间隔触发器,它无法执行或未能被置为挂起状态,因此被丢弃。
如果您的doStuff()函数通常需要执行的时间比设置的间隔时间长,那么浏览器将会占用100%的CPU尝试服务它,并可能变得不太响应。
你使用哪个并说明原因?
Chained-Timeout会给浏览器留出一个保证的空闲时间槽;Interval试图确保正在运行的功能在其计划的时间尽可能接近地执行,以牺牲浏览器UI的可用性。
如果我想要流畅度尽可能高的一次性动画,我会考虑使用Interval,而对于在页面加载时一直进行的持续动画,则使用链接的超时更加礼貌。对于不太苛刻的用途(例如每30秒触发一次的无足轻重的更新程序),您可以安全地使用任何一个。
就浏览器兼容性而言,setTimeout早于setInterval,但是今天所有的浏览器都支持这两种方法。多年来最后的落伍者是WinMo <6.5中的IE Mobile,但希望这也已经过去了。