浅谈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的函数重名看其初始化方式
Mar 08 Javascript
jQuery 使用手册(三)
Sep 23 Javascript
jQuery在html有效在jsp无效的原因及解决方法
Aug 02 Javascript
javascript中使用正则计算中文长度的例子
Apr 29 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
Dec 09 Javascript
jQuery实现菜单式图片滑动切换
Mar 14 Javascript
jQuery实现图片左右滚动特效
Apr 20 Javascript
javascript原生ajax写法分享
Apr 10 Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
Jul 27 Javascript
js窗口震动小程序分享
Nov 28 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
Jul 13 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
Aug 14 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 post大量数据时发现数据丢失问题解决方法
2015/06/20 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
js textarea自动增高并隐藏滚动条
2009/12/16 Javascript
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
Vue2.0组件间数据传递示例
2017/03/07 Javascript
深入理解基于vue-cli的vuex配置
2017/07/24 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
JavaScript继承定义与用法实践分析
2018/05/28 Javascript
详解npm 配置项registry修改为淘宝镜像
2018/09/07 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
js字符串倒序的实例代码
2018/11/30 Javascript
Python中使用partial改变方法默认参数实例
2015/04/28 Python
python数组过滤实现方法
2015/07/27 Python
Python 获取主机ip与hostname的方法
2018/12/17 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
python 轮询执行某函数的2种方式
2020/05/03 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
加拿大时尚少女服装品牌:Garage
2016/10/10 全球购物
维多利亚的秘密官方旗舰店:VICTORIA’S SECRET
2018/04/02 全球购物
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
给导游的表扬信
2014/01/10 职场文书
母亲节演讲稿
2014/05/27 职场文书
应届大专生求职信
2014/06/26 职场文书
员工培训协议书
2014/09/15 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
参观监狱警示教育心得体会
2016/01/15 职场文书
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL