浅谈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 相关文章推荐
js event事件的传递与冒泡处理
Dec 06 Javascript
Underscore.js 的模板功能介绍与应用
Dec 24 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
Apr 08 Javascript
node.js中的fs.realpathSync方法使用说明
Dec 16 Javascript
js面向对象之静态方法和静态属性实例分析
Jan 10 Javascript
简述JavaScript对传统文档对象模型的支持
Jun 16 Javascript
jQuery常见面试题之DOM操作详析
Jul 05 jQuery
js阻止默认右键的下拉菜单方法
Jan 02 Javascript
jQuery实现动态显示select下拉列表数据的方法
Feb 05 jQuery
Node.js模块全局安装路径配置方法
May 17 Javascript
highCharts提示框中显示当前时间的方法
Jan 18 Javascript
JS class语法糖的深入剖析
Jul 07 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+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
2013/07/05 PHP
js四舍五入数学函数round使用实例
2014/05/09 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
2016/06/10 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
2016/11/03 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
Angularjs 事件指令详细整理
2017/07/27 Javascript
jQuery上传插件webupload使用方法
2017/08/01 jQuery
浅谈实现vue2.0响应式的基本思路
2018/02/13 Javascript
vue路由事件beforeRouteLeave及组件内定时器的清除方法
2018/09/29 Javascript
JavaScript函数Call、Apply原理实例解析
2020/02/17 Javascript
vue实现两个组件之间数据共享和修改操作
2020/11/12 Javascript
[02:21]十步杀一人,千里不留行——DOTA2全新英雄天涯墨客展示
2018/08/29 DOTA
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
matplotlib绘图实例演示标记路径
2018/01/23 Python
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
python ipset管理 增删白名单的方法
2019/01/14 Python
浅析Python 引号、注释、字符串
2019/07/25 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
2019/08/19 Python
python wxpython 实现界面跳转功能
2019/12/17 Python
Python的形参和实参使用方式
2019/12/24 Python
如何基于Python创建目录文件夹
2019/12/31 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
python 决策树算法的实现
2020/10/09 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
衰败城市英国官网:Urban Decay英国
2020/04/29 全球购物
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
论文评语大全
2014/04/29 职场文书
北京英语导游词
2015/02/12 职场文书
python process模块的使用简介
2021/05/14 Python
Spring Boot项目传参校验的最佳实践指南
2022/04/05 Java/Android