setTimeout函数的神奇使用

  

【写在前面的胡言乱语】

  

自从大三开始实习之后,就没有写博客了,虽然学了很多东西,但是如果没有进行总结和分享,学的东西就很容易忘记,而且不进行分享,就不会手动去敲代码,这样对知识的理解就不够透彻。

  

现在毕业半年多了,最近学习了《JavaScript高级程序设计》这本书,受益匪浅,看了才知道虽然自己写了那么多JS,但是对JS的理解最多就只是中下水平。

  

现在看第二遍,边看边敲代码,边分享,希望看到这篇文章的你,能有所收获。

  

  

【这是正文】

  

《JavaScript高级程序设计》这本书里面,介绍了很多关于setTimeout函数的神奇使用,今天来介绍下第一个——使用setTimeout代替setInterval进行间歇调用。

  

书中是这么说的

  

"在开发环境下,很少使用间歇调用(setInterval),原因是后一个间歇调用很可能在前一个间歇调用结束前启动”。

  

这话怎么理解呢?

  

首先我们来看一下一般情况下的setInterval函数的使用,以及如何使用setTimeout代替setInterval

  

        var executeTimes=0;      var intervalTime=500;      var intervalId=零;//放开下面的注释运行setInterval的演示      intervalId=setInterval (intervalFun intervalTime);//放开下面的注释运行setTimeout的演示//setTimeout (timeOutFun intervalTime);            函数intervalFun () {      executeTimes + +;      console.log (“doIntervalFun——“+ executeTimes);      如果(executeTimes==5) {      clearInterval (intervalId);      }      }            函数timeOutFun () {      executeTimes + +;      console.log (“doTimeOutFun——“+ executeTimes);      如果(executeTimes<5) {      setTimeout (arguments.callee intervalTime);      }      }      

代码比较简单,我们只是在setTimeout的方法里面又调用了一次setTimeout,就可以达到间歇调用的目的。

  

  

重点来了,为什么作者建议我们使用setTimeout代替setInterval呢? setTimeout式的间歇调用和传统的setInterval间歇调用有什么区别呢?

  

区别在于,setInterval间歇调用,是在前一个方法执行前,就开始计时,比如间歇时间是500 ms,那么不管那时候前一个方法是否已经执行完毕,都会把后一个方法放入执行的序列中。这时候就会发生一个问题,假如前一个方法的执行时间超过500 ms,加入是1000 ms,那么就意味着,前一个方法执行结束后,后一个方法马上就会执行,因为此时间歇时间已经超过500 ms了。

  

书中没有给出代码证明这个结论,于是自己写了一段代码来验证。

        var executeTimes=0;      var intervalTime=500;      var intervalId=零;      .getTime var oriTime=new日期()();//放开下面的注释运行setInterval的演示      intervalId=setInterval (intervalFun intervalTime);//放开下面的注释运行setTimeout的演示//setTimeout (timeOutFun intervalTime);            函数intervalFun () {      executeTimes + +;      var nowExecuteTimes=executeTimes;      var timeDiff=new日期().getTime () - oriTime;      控制台。日志(“doIntervalFun——”+ nowExecuteTimes +”,后“+ timeDiff +“女士”);      var delayParam=0;      睡眠(1000);      控制台。日志(“doIntervalFun——”+ nowExecuteTimes +“完成!”);      如果(executeTimes==5) {      clearInterval (intervalId);      }      }            函数timeOutFun () {      executeTimes + +;      var nowExecuteTimes=executeTimes;      var timeDiff=new日期().getTime () - oriTime;      控制台。日志(“doTimeOutFun——”+ nowExecuteTimes +”,后“+ timeDiff +“女士”);      var delayParam=0;      睡眠(1000);      控制台。日志(“doTimeOutFun——”+ nowExecuteTimes +“完成!”);      如果(executeTimes<5) {      setTimeout (arguments.callee intervalTime);      }      }            函数睡眠(sleepTime) {      .getTime var=new开始日期()();      而(真){      如果(新日期().getTime () -start> sleepTime) {      打破;      }      }      }      

(这里使用大牛提供的睡眠函数来模拟函数运行的时间)

setTimeout函数的神奇使用