浅谈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 相关文章推荐
效率高的Javscript字符串替换函数的benchmark
Aug 02 Javascript
跨浏览器开发经验总结(三)   警惕“IE依赖综合症”
May 13 Javascript
JavaScript中使用arguments获得函数传参个数实例
Aug 27 Javascript
Javascript调用函数方法的几种方式介绍
Mar 20 Javascript
JavaScript函数使用的基本教程
Jun 04 Javascript
Node.js实现JS文件合并小工具
Feb 02 Javascript
基于javascript制作微信聊天面板
Aug 09 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
Jan 05 Javascript
JS中用EL表达式获取上下文参数值的方法
Mar 28 Javascript
详解vue路由篇(动态路由、路由嵌套)
Jan 27 Javascript
vue-cli3配置与跨域处理方法
Aug 17 Javascript
js 执行上下文和作用域的相关总结
Feb 08 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
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
深入了解php4(2)--重访过去
2006/10/09 PHP
php使用正则验证中文
2016/04/06 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
一个符号插入器 中用到的js代码
2007/09/04 Javascript
jquery给图片添加鼠标经过时的边框效果
2013/11/12 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
jQuery设置Easyui校验规则(推荐)
2016/11/21 Javascript
微信小程序动态显示项目倒计时效果
2017/06/13 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
2019/01/21 Javascript
JavaScript封闭函数及常用内置对象示例
2019/05/13 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
详解Vue的mixin策略
2020/11/19 Vue.js
JavaScript实现雪花飘落效果
2020/12/27 Javascript
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
在Django的URLconf中使用命名组的方法
2015/07/18 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
2017/05/19 Python
python urllib爬取百度云连接的实例代码
2017/06/19 Python
pytorch 状态字典:state_dict使用详解
2020/01/17 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
Python IDE环境之 新版Pycharm安装详细教程
2020/03/05 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
2020/04/10 Python
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
HTML5制作3D爱心动画教程 献给女友浪漫的礼物
2014/11/05 HTML / CSS
德国户外装备、登山运动和攀岩商店:tapir store
2020/02/12 全球购物
儿科护理实习自我鉴定
2013/09/19 职场文书
后勤岗位职责
2013/11/26 职场文书
学生会离职感言
2014/02/11 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
龙门石窟导游词
2015/02/02 职场文书
养成教育工作总结
2015/08/13 职场文书
对讲机知识
2022/04/07 无线电