为了账号安全,请及时绑定邮箱和手机立即绑定

setTimeout还是setInterval?

setTimeout还是setInterval?

setTimeout还是setInterval?据我所知,这两个javascript的行为方式相同:选项A:function myTimeoutFunction(){     doStuff();     setTimeout(myTimeoutFunction, 1000);}myTimeoutFunction();选项B:function myTimeoutFunction(){     doStuff();}myTimeoutFunction();setInterval(myTimeoutFunction, 1000);使用setTimeout和setInterval有什么区别吗?
查看完整描述

3 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

有什么区别吗?


是。调用setTimeout()后,超时执行一定的时间; 间隔在上一个间隔触发后执行一定的时间。


如果doStuff()函数需要一段时间才能执行,您会注意到区别。例如,如果我们使用setTimeout / setInterval表示调用,.使用*和执行JavaScript代码触发超时/间隔[-----],则时间轴如下所示:


Timeout:


.    *  .    *  .    *  .    *  .

     [--]    [--]    [--]    [--]


Interval:


.    *    *    *    *    *    *

     [--] [--] [--] [--] [--] [--]

下一个复杂情况是,如果在JavaScript已经忙于执行某些操作(例如处理上一个间隔)时会触发间隔。在这种情况下,会记住间隔,并在上一个处理程序完成后立即发生并将控制权返回给浏览器。因此,例如doStuff()过程有时很短([ - ]),有时很长([-----]):


.    *    *    •    *    •    *    *

     [-]  [-----][-][-----][-][-]  [-]

•表示无法立即执行其代码的间隔触发,而是取而代之。


因此,间隔试图“赶上”以按时恢复。但是,它们并不排在一起:每个区间只能有一个执行挂起。(如果他们都排队等候,浏览器会留下不断扩展的未完成执行列表!)


.    *    •    •    x    •    •    x

     [------][------][------][------]

x表示无法执行或被挂起的间隔触发,因此被丢弃。


如果你的doStuff()函数通常需要比为它设置的时间间隔更长的时间来执行,那么浏览器会吃100%的CPU来尝试为它提供服务,并且可能会降低响应速度。


你用哪个?为什么?


Chained-Timeout为浏览器提供了保证的空闲时间; Interval尝试确保其运行的功能尽可能接近其预定时间执行,但代价是浏览器UI可用性。


我会考虑一次性动画的间隔,我希望尽可能平滑,而链式超时对正在进行的动画更有礼貌,这些动画会在页面加载时一直发生。对于要求较低的用途(例如每30秒触发一次微不足道的更新程序),您可以安全地使用它们。


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


查看完整回答
反对 回复 2019-05-29
?
慕容708150

TA贡献1831条经验 获得超4个赞

的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()。这是因为它只在达到指定的间隔时执行一次。


查看完整回答
反对 回复 2019-05-29
  • 3 回答
  • 0 关注
  • 781 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信