setTimeout函数的神奇使用

 更新时间:2017年02月26日 15:50:00   作者:Javdroider  
setTimeout函数是一个原生的javascript函数。setTimeout函数会在一个指定的延迟时间之后调用一个函数或执行一段指定的代码。它的应用非常广泛,例如我们希望用户在浏览器某个页面一段时间后弹出一个对话框,或者是鼠标点击某个元素后隔几秒钟在删除这个元素。

【写在前面的胡言乱语】

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

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

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

【这是正文】

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

  书中是这么说的

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

  这话怎么理解呢?

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

var executeTimes = 0;

var intervalTime = 500;

var intervalId = null;

 

// 放开下面的注释运行setInterval的Demo

intervalId = setInterval(intervalFun,intervalTime);

// 放开下面的注释运行setTimeout的Demo

// setTimeout(timeOutFun,intervalTime);

 

function intervalFun(){

executeTimes++;

console.log("doIntervalFun——"+executeTimes);

if(executeTimes==5){

clearInterval(intervalId);

}

}

 

function timeOutFun(){

executeTimes++;

console.log("doTimeOutFun——"+executeTimes);

if(executeTimes<5){

setTimeout(arguments.callee,intervalTime);

}

}

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

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

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

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

var executeTimes = 0;

var intervalTime = 500;

var intervalId = null;

var oriTime = new Date().getTime();

 

// 放开下面的注释运行setInterval的Demo

intervalId = setInterval(intervalFun,intervalTime);

// 放开下面的注释运行setTimeout的Demo

// setTimeout(timeOutFun,intervalTime);

 

function intervalFun(){

executeTimes++;

var nowExecuteTimes = executeTimes;

var timeDiff = new Date().getTime() - oriTime;

console.log("doIntervalFun——"+nowExecuteTimes+", after " + timeDiff + "ms");

var delayParam = 0;

sleep(1000);

console.log("doIntervalFun——"+nowExecuteTimes+" finish !");

if(executeTimes==5){

clearInterval(intervalId);

}

}

 

function timeOutFun(){

executeTimes++;

var nowExecuteTimes = executeTimes;

var timeDiff = new Date().getTime() - oriTime;

console.log("doTimeOutFun——"+nowExecuteTimes+", after " + timeDiff + "ms");

var delayParam = 0;

sleep(1000);

console.log("doTimeOutFun——"+nowExecuteTimes+" finish !");

if(executeTimes<5){

setTimeout(arguments.callee,intervalTime);

}

}

 

function sleep(sleepTime){

var start=new Date().getTime();

while(true){

  if(new Date().getTime()-start>sleepTime){

  break;

}

}

}

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

  执行setInterval的Demo方法,看控制台

  可以发现,fun2和fun1开始的间歇接近1000ms,刚好就是fun1的执行时间,也就意味着fun1执行完后fun2马上就执行了,和我们间歇调用的初衷背道而驰。

  我们注释掉setInterval的Demo方法,放开setTimeout的Demo方法,运行,查看控制台

  这下终于正常了,fun1和fun2相差了1500ms = 1000 + 500,fun2在fun1执行完的500ms后执行。

  不知道你有没有和我一样脑洞大开,反正我是感觉视野又开阔了一点,setTimeout的妙用还有很多,下次接着聊!

相关文章

  • js获取对象中所有属性的四种方法

    js获取对象中所有属性的四种方法

    这篇文章主要给大家介绍了关于js获取对象中所有属性的四种方法,在JavaScript 中,我们可以通过不同的方法获取对象的属性,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • 一篇文章带你学会JavaScript计时事件

    一篇文章带你学会JavaScript计时事件

    JS可以实现很多java代码不易完成的功能,下面这篇文章主要给大家介绍了关于如何通过一篇文章带你学会JavaScript计时事件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • JavaScript实现点击按钮切换网页背景色的方法

    JavaScript实现点击按钮切换网页背景色的方法

    这篇文章主要介绍了JavaScript实现点击按钮切换网页背景色的方法,涉及JavaScript基于鼠标事件动态操作页面元素样式的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Bootstrap滚动监听(Scrollspy)插件详解

    Bootstrap滚动监听(Scrollspy)插件详解

    滚动监听插件是用来根据滚动条所处在的位置自动更新导航项目, 显示导航项目高亮显示。这篇文章主要介绍了Bootstrap滚动监听(Scrollspy)插件的相关资料,需要的朋友可以参考下
    2016-04-04
  • js判断undefined类型,undefined,null, 的区别详细解析

    js判断undefined类型,undefined,null, 的区别详细解析

    本篇文章主要是对js判断undefined类型,undefined,null,NaN的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-12-12
  • 原生js实现下拉框功能(支持键盘事件)

    原生js实现下拉框功能(支持键盘事件)

    本文主要分享了原生js实现下拉框(支持键盘事件)功能的示例代码。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • javascript实现文字无缝滚动效果

    javascript实现文字无缝滚动效果

    这篇文章主要为大家详细介绍了javascript实现文字无缝滚动效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • javascript 寻找错误方法整理

    javascript 寻找错误方法整理

    为了以后能快速寻找到这方面的错误,节约更多的时间,下面将问题的解决方法整理了一下
    2014-06-06
  • 微信小程序实现简单购物车功能

    微信小程序实现简单购物车功能

    这篇文章主要为大家详细介绍了微信小程序实现简单购物车功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例

    JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例

    在本篇文章里小编给大家分享的是关于利用JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作,需要的朋友们学习下。
    2019-09-09

最新评论