浅谈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 相关文章推荐
基于jquery的模态div层弹出效果
Aug 21 Javascript
JS模板实现方法
Apr 03 Javascript
Jquery创建一个层当鼠标移动到层上面不消失效果
Dec 12 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
Jun 16 Javascript
javascript在当前窗口关闭前检测窗口是否关闭
Sep 29 Javascript
javascript jquery对form元素的常见操作详解
Jun 12 Javascript
纯javascript版日历控件
Nov 24 Javascript
jQuery中 DOM节点操作方法大全
Oct 12 jQuery
Vue中的验证登录状态的实现方法
Mar 09 Javascript
使vue实现jQuery调用的两种方法
May 12 jQuery
Vue拖拽组件列表实现动态页面配置功能
Jun 17 Javascript
JavaScript字符串处理常见操作方法小结
Nov 15 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
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
php array_values 返回数组的值实例详解
2016/11/17 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
给Function做的OOP扩展
2009/05/07 Javascript
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
jQuery EasyUI API 中文文档 可调整尺寸
2011/09/29 Javascript
js Form.elements[i]的使用实例
2011/11/13 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
原生js二级联动效果
2017/06/20 Javascript
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
2018/12/06 NodeJs
微信小程序实现授权登录
2019/05/15 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
简单谈谈python的反射机制
2016/06/28 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
python之从文件读取数据到list的实例讲解
2018/04/19 Python
Django框架orM与自定义SQL语句混合事务控制操作
2019/06/27 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
pytorch-RNN进行回归曲线预测方式
2020/01/14 Python
Python趣味入门教程之循环语句while
2020/08/26 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
css3实现一款模仿iphone样式的注册表单
2013/03/20 HTML / CSS
js实现移动端H5页面手指滑动刻度尺功能
2017/11/16 HTML / CSS
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
加拿大女包品牌:Matt & Nat
2017/05/12 全球购物
会计专业推荐信
2013/10/29 职场文书
汽车技术服务英文求职信范文
2014/01/02 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
幼儿园小班见习报告
2014/10/31 职场文书
孔庙导游词
2015/02/04 职场文书
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers