浅谈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 相关文章推荐
脚本安需导入(装载)的三种模式的对比
Jun 24 Javascript
动态加载脚本提升javascript性能
Feb 24 Javascript
JavaScript与jQuery实现的闪烁输入效果
Feb 18 Javascript
js实现拖拽功能
Mar 01 Javascript
微信小程序中用WebStorm使用LESS
Mar 08 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
Aug 15 Javascript
JSON创建键值对(key是中文或者数字)方式详解
Aug 24 Javascript
jQuery实现的简单无刷新评论功能示例
Nov 08 jQuery
bootstrap treeview 树形菜单带复选框及级联选择功能
Jun 08 Javascript
vue--vuex详解
Apr 15 Javascript
Vue+Element实现动态生成新表单并添加验证功能
May 23 Javascript
JS浏览器BOM常见操作实例详解
Apr 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面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
深入Nginx + PHP 缓存详解
2013/07/11 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
php获取POST数据的三种方法实例详解
2016/12/20 PHP
PHP Swoole异步MySQL客户端实现方法示例
2019/10/24 PHP
PHP代码加密的方法总结
2020/03/13 PHP
List Information About the Binary Files Used by an Application
2007/06/18 Javascript
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
2014/03/13 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
javascript里使用php代码实例
2014/12/13 Javascript
jQuery插件windowScroll实现单屏滚动特效
2015/07/14 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
跟我学习javascript的arguments对象
2015/11/16 Javascript
js 自带的sort() 方法全面了解
2016/08/16 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
2016/09/26 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
python实现马耳可夫链算法实例分析
2015/05/20 Python
用TensorFlow实现戴明回归算法的示例
2018/05/02 Python
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
python flask解析json数据不完整的解决方法
2019/05/26 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
使用TensorBoard进行超参数优化的实现
2020/07/06 Python
Python基于gevent实现文件字符串查找器
2020/08/11 Python
matplotlib 范围选区(SpanSelector)的使用
2021/02/24 Python
美国最大的旗帜经销商:Carrot-Top
2018/02/26 全球购物
SteelSeries赛睿官网:游戏外设和配件的领先制造商(耳机、键盘、鼠标和鼠标垫)
2018/06/17 全球购物
Hotels.com印度:酒店预订
2019/05/11 全球购物
房地产开发计划书
2014/01/10 职场文书
古汉语文学求职信范文
2014/03/16 职场文书
2014年国庆标语
2014/06/30 职场文书
帝企鹅日记观后感
2015/06/10 职场文书
红白喜事主持词
2015/07/06 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书
导游词之青岛太清宫
2019/12/13 职场文书