有什么区别吗?
是。在调用setTimeout()之后,超时将执行一定的时间;间隔在上一个间隔触发后执行一定的时间。
如果您的doStuff()函数需要一段时间才能执行,则您会注意到差异。例如,如果我们用表示对setTimeout / setInterval的调用,用.
表示超时/间隔的触发,*
并用表示JavaScript代码执行[-----]
,则时间线如下所示:
Timeout:
. * . * . * . * .
[--] [--] [--] [--]
Interval:
. * * * * * *
[--] [--] [--] [--] [--] [--]
下一个复杂的问题是,如果在JavaScript已经忙于执行某项操作(例如处理上一个间隔)的同时触发了间隔,则该操作会变得很复杂。在这种情况下,该间隔将被记住,并在前一个处理程序完成并将控制权返回给浏览器后立即发生。例如,对于一个有时短([-])有时长([-----])的doStuff()过程:
. * * • * • * *
[-] [-----][-][-----][-][-] [-]
•表示无法立即执行其代码的间隔触发,而是改为等待执行。
因此,间隔尝试“赶上”以恢复原定计划。但是,它们不会彼此排长队:每个间隔只能有一个执行挂起。(如果他们都排队,那么浏览器将得到不断扩大的出色执行列表!)
. * • • x • • x
[------][------][------][------]
x表示无法执行或待定的间隔触发,因此被丢弃。
如果您的doStuff()函数习惯性地花费比为其设置的时间间隔执行的时间长,则浏览器将消耗100%的CPU尝试为其服务,并且响应速度可能会变慢。
您使用哪个?为什么?
链接超时为浏览器提供了一定的空闲时间。Interval尝试确保正在运行的功能尽可能接近其计划时间执行,但以牺牲浏览器UI可用性为代价。
我会考虑一次平滑的动画间隔,希望尽可能平滑,而链式超时对于在页面加载过程中始终出现的正在进行的动画更礼貌。对于要求不高的用途(例如每30秒触发一次琐碎的更新程序),您可以放心使用。
在浏览器兼容性方面,setTimeout早于setInterval,但是您今天将要使用的所有浏览器都支持这两种。多年以来的最后一次失败是WinMo <6.5中的IE Mobile,但希望现在也已经过去。