浅谈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 不只是脚本
May 30 Javascript
关于JS中的闭包浅谈
Aug 23 Javascript
javascript随机之洗牌算法深入分析
Jun 07 Javascript
JS获取iframe中longdesc属性的方法
Apr 01 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
Sep 04 Javascript
jstl中判断list中是否包含某个值的简单方法
Oct 14 Javascript
JavaScript判断输入是否为数字类型的方法总结
Sep 28 Javascript
微信小程序授权登录及解密unionId出错的方法
Sep 26 Javascript
js限制输入框只能输入数字(onkeyup触发)
Sep 28 Javascript
taro开发微信小程序的实践
May 21 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
Sep 27 Javascript
jQuery 添加元素和删除元素的方法
Jul 15 jQuery
简介可以自动完成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返回json数据函数实例
2014/10/09 PHP
PHP curl使用实例
2015/07/02 PHP
jquery制作select列表双向选择示例代码
2014/09/02 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
2016/04/29 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
node.js平台下的mysql数据库配置及连接
2017/03/31 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
2020/12/30 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
python访问纯真IP数据库的代码
2011/05/19 Python
python 远程统计文件代码分享
2015/05/14 Python
Python从MP3文件获取id3的方法
2015/06/15 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
2017/07/06 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
详解Python 装饰器执行顺序迷思
2018/08/08 Python
python实践项目之监控当前联网状态详情
2019/05/23 Python
python 将日期戳(五位数时间)转换为标准时间
2019/07/11 Python
Python实现基于socket的udp传输与接收功能详解
2019/11/15 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
html5中的input新属性range使用记录
2014/09/05 HTML / CSS
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
美国领先的家庭健康检测试剂盒提供商:LetsGetChecked
2019/03/18 全球购物
英国最受信任的在线眼镜商之一:Fashion Eyewear
2019/10/31 全球购物
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
离婚协议书的书写要求
2014/09/17 职场文书
母亲节寄语大全
2015/02/27 职场文书
英语通知范文
2015/04/22 职场文书
求职意向书范本
2015/05/11 职场文书
远程教育培训心得体会
2016/01/09 职场文书
MySQL系列之八 MySQL服务器变量
2021/07/02 MySQL
JVM钩子函数的使用场景详解
2021/08/23 Java/Android
MySQL 数据库范式化设计理论
2022/04/22 MySQL