浅谈setTimeout 与 setInterval


Posted in Javascript onJune 23, 2015

最新写代码中时,看到项目中有人用到了 setTimeout(fun,0),于是想总结一下。个人理解,如果有错误的地方还请指出。THX

要想理解JavaScript的定时器是如何工作的,先要明白 JavaScript 引擎是单线程的。这个可以理解为 javascript 引擎是一个服务员,它有一个服务的队列,所有的界面元素事件,定时触发器回调,异步请求回调都要在这个任务队列里排队,等待处理。所有任务都是一个最小单位,不会中断处理。这样就可以理解 setTimeout(fun,0) 了,它并不是代表立即执行该代码,除非任务队列为空(事实上,各个浏览器在实际执行这个的时候也是有差异了,比较新的浏览器实际可能是在4ms;老版本的可能更长一点,16ms也是可能的)。而 setTimeout(fun,time) 的意思就是多少时间后将 fun 回调加到这个任务队列中,也就是至少需要time时间才会执行fun。

举个例子:

setTimeout(function () {
 console.log(1);
}, 0);
var tem = 0;
for (var i = 1; i < 1000000; i++) {
 tem += i;
};
console.log(2);

显示结果为

2

1

就是说,在执行 setTimeout 时,将 function 回调加入了任务队列,但并没有立即执行,因为js引擎还在忙着处理当前的js,而只在这段代码段执行完才去任务列表里取新的任务,所以结果就是先显示 2 后显示 1。

setInterval(fun, time)方法是,每隔一定时间将fun添加到队列中,那么问题来,如果fun执行时间比 time 要长的时候怎么办?

看一段代码

var num = 0;
var time = setInterval(function () {
 var tem = 0;
 for (var i = 1; i < 99999999; i++) {
 tem += i;
 };
 num ++;
 console.log(num);
}, 100);

setTimeout(function (){
 clearInterval(time);
}, 1000);

意思是每隔100ms执行一段代码,在1s中后清除这个定时器。但是结果呢?

显示结果为

1

2

3

也就是说,事实上,并没有执行到那么多次数。也就是说某些间隔会被跳过,这也就存在多个代码执行的间隔可能会比预期的小。原来在将定时器代码加入队列的时候,如果该定时器的代码实例存在时,该次定时器代码会被跳过。

引用一张图片,就很好理解了。

浅谈setTimeout 与 setInterval

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
JavaScript 对象链式操作测试代码
Apr 25 Javascript
JQuery中form验证出错信息的查看方法
Oct 08 Javascript
详解基于Bootstrap扁平化的后台框架Ace
Nov 27 Javascript
学习jQuey中的return false
Dec 18 Javascript
总结几道关于Node.js的面试问题
Jan 11 Javascript
jQuery插件echarts实现的单折线图效果示例【附demo源码下载】
Mar 04 Javascript
AngularJS实现进度条功能示例
Jul 05 Javascript
JS实现在文本指定位置插入内容的简单示例
Dec 22 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
May 08 Javascript
Vue实现固定定位图标滑动隐藏效果
May 30 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
Sep 13 Javascript
简单了解微信小程序 e.target与e.currentTarget的不同
Sep 27 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
Jun 23 #Javascript
javascript中传统事件与现代事件
Jun 23 #Javascript
浅谈jquery中delegate()与live()
Jun 22 #Javascript
jquery 中ajax执行的优先级
Jun 22 #Javascript
jquery中ready()函数执行的时机和window的load事件比较
Jun 22 #Javascript
jquery中toggle函数交替使用问题
Jun 22 #Javascript
浅谈js 闭包引起的内存泄露问题
Jun 22 #Javascript
You might like
php短址转换实现方法
2015/02/25 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
PHP通过get方法获得form表单数据方法总结
2018/09/12 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
JS实现两表格里数据来回转移的方法
2015/05/28 Javascript
js事件监听器用法实例详解
2015/06/01 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
js removeChild 方法深入理解
2016/08/16 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
vue2.0$nextTick监听数据渲染完成之后的回调函数方法
2018/09/11 Javascript
vue上传图片到oss的方法示例(图片带有删除功能)
2018/09/27 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
MySQLdb ImportError: libmysqlclient.so.18解决方法
2014/08/21 Python
为Python的web框架编写MVC配置来使其运行的教程
2015/04/30 Python
Python数据拟合与广义线性回归算法学习
2017/12/22 Python
基于Django框架利用Ajax实现点赞功能实例代码
2018/08/19 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
python实现扫雷游戏
2020/03/03 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
python中pathlib模块的基本用法与总结
2020/08/17 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
html5 canvas 简单画板实现代码
2012/01/05 HTML / CSS
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
动物学专业毕业生求职信
2013/10/11 职场文书
自我鉴定写作要点
2014/01/17 职场文书
四年级科学教学反思
2014/02/10 职场文书
供货协议书范本
2014/04/22 职场文书
《鸿门宴》教学反思
2014/04/22 职场文书
幽默自我介绍演讲稿
2014/08/21 职场文书
上学路上观后感
2015/06/16 职场文书
如何起草一份正确的合伙创业协议书?
2019/07/04 职场文书
CSS3新特性详解(五):多列columns column-count和flex布局
2021/04/30 HTML / CSS
MySQL数据库实验实现简单数据库应用系统设计
2022/06/21 MySQL
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server