A-A+

js中setTimeout和setInterval性能详解

2016年10月15日 前端设计 暂无评论 阅读 5 views 次

在js中setTimeout和setInterval都是用来定时的一个功能,下面我来分别对两个函数进行一些自问自答,有需要了解的朋友可参考。
我以前看书上这样写的:setTimeout完全可以完成setInterval的作用,而且setTimeout是执行一次自动终止,setInterval则不需手动停止所以建议用setTimeout替代setInterval使代码避免出现末预期到的执行循环.

在网上找了很多倒计时的,发现都是用setTimeout的,形如如下代码:

  1. function docount()  
  2. {  
  3.     对传入的时间进行减减操作  
  4.        “假设”这个函数执行了2S才能完成  
  5. }  
  6.   
  7. setTimeout(cc,1000)  
  8. function cc()  
  9. {  
  10.    dosomething();  
  11.   setTimeout(cc,1000)  
  12. }  

有人说游览器处理JS时单进程的,现在假设 dosomething执行了2秒(这是假设,实际不可能),等dosomething执行完,再调用setTimeout这样来做倒计时不就不准了吗?

再来问,代码如下:

  1. setInterval(  
  2. function(){  
  3.    dosomething()  
  4. },1000  
  5. )  

相反的setInterval 是强制每1秒执行dosomething,假设dosomething也花了2秒,那么是不是
代码队列在执行dosomething过程中,发现setInterval到时间了,但是发现doshoething没执行完,就跳出当前这个setInterval的执行?

问得有点乱,只是发现为什么大家都用setTimeout做定时器,我感觉setInterval不是更容易些,而且更准确些(毕竟一般dosomethis几乎执行就几MS时间)

总结:

setTimeout递归执行的代码必须是上一次执行完了并间格一定时间才再次执行,比仿说: setTimeout延迟时间为1秒执行, 要执行的代码需要2秒来执行,那这段代码上一次与下一次的执行时间为3秒. 而不是我们想象的每1秒执行一次.

setInterval是排队执行的

比仿说: setInterval每次执行时间为1秒,而执行的代码需要2秒执行, 那它还是每次去执行这段代码, 上次还没执行完的代码会排队, 上一次执行完下一次的就立即执行, 这样实际执行的间隔时间为2秒.

这样的话在我看来, 如果setInterval执行的代码时间长度比每次执行的间隔段的话,就没有意义,并且队伍越来越长,内存就被吃光了.如果某一次执行被卡住了,那程序就会被堵死.

而setTimout以下写法不会出现因为一次被堵住,而内存被吃光的问题. 但是执行的时间隔是不准确和确定的.

标签:

给我留言