setTimeout函数的神奇使用


Posted in Javascript onFebruary 26, 2017

【写在前面的胡言乱语】

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

现在毕业半年多了,最近学习了《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方法,看控制台

setTimeout函数的神奇使用

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

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

setTimeout函数的神奇使用

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

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

Javascript 相关文章推荐
slice函数的用法 之不错的应用
Dec 29 Javascript
原生javascript和jquery判断浏览器版本等信息
Jul 04 Javascript
js+html5实现可在手机上玩的拼图游戏
Jul 17 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
Aug 07 Javascript
JS实现自动切换文字的导航效果代码
Aug 27 Javascript
jQuery实现图片轮播特效代码分享
Sep 15 Javascript
深入理解Java线程编程中的阻塞队列容器
Dec 07 Javascript
基于JQuery的购物车添加删除以及结算功能示例
Mar 08 Javascript
jQuery实现 RadioButton做必选校验功能
Jun 15 jQuery
详解如何使用webpack打包多页jquery项目
Feb 01 jQuery
mpvue微信小程序多列选择器用法之省份城市选择的实现
Mar 07 Javascript
深入浅析vue中cross-env的使用
Sep 12 Javascript
node.js入门学习之url模块
Feb 25 #Javascript
从零学习node.js之利用express搭建简易论坛(七)
Feb 25 #Javascript
从零学习node.js之express入门(六)
Feb 25 #Javascript
Node.JS中事件轮询(Event Loop)的解析
Feb 25 #Javascript
走进javascript——不起眼的基础,值和分号
Feb 24 #Javascript
angular.js 路由及页面传参示例
Feb 24 #Javascript
实例解析js中try、catch、finally的执行规则
Feb 24 #Javascript
You might like
全国FM电台频率大全 - 21 海南省
2020/03/11 无线电
PHP技术开发技巧分享
2010/03/23 PHP
PHP 获取文件权限函数介绍
2013/07/11 PHP
smarty中常用方法实例总结
2015/08/07 PHP
php从身份证获取性别和出生年月
2017/02/09 PHP
Expandable &quot;Detail&quot; Table Rows
2007/08/29 Javascript
javascript 面向对象思想 附源码
2009/07/07 Javascript
javascript document.execCommand() 常用解析
2009/12/14 Javascript
一个判断抢购时间是否到达的简单的js函数
2014/06/23 Javascript
Javascript中arguments用法实例分析
2015/06/13 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
Vue侧滑菜单组件——DrawerLayout
2017/12/18 Javascript
vue2.0 elementUI制作面包屑导航栏
2018/02/22 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
2018/08/08 jQuery
使用vue实现各类弹出框组件
2019/07/03 Javascript
jquery更改元素属性attr()方法操作示例
2020/05/22 jQuery
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
Python连接phoenix的方法示例
2017/09/29 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
2018/02/07 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
解决Python3中的中文字符编码的问题
2018/07/18 Python
python实现录屏功能(亲测好用)
2020/03/02 Python
python实现对变位词的判断方法
2020/04/05 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
PyCharm 2020.2 安装详细教程
2020/09/25 Python
html5中valid、invalid、required的定义
2014/02/21 HTML / CSS
LUISAVIAROMA德国官网:时尚奢侈品牌购物网站
2020/11/12 全球购物
构造方法和其他方法的区别?怎么调用父类的构造方法
2013/09/22 面试题
食品安全检查制度
2014/02/03 职场文书
十佳护士获奖感言
2014/02/18 职场文书
环保标语口号
2014/06/13 职场文书
具结保证书
2015/01/17 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS
用Python爬虫破解滑动验证码的案例解析
2021/05/06 Python