浅谈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 相关文章推荐
使用新的消息弹出框blackbirdjs
Oct 16 Javascript
jQuery EasyUI API 中文文档 - Panel面板
Sep 30 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
Mar 08 Javascript
jquery插件珍藏(图片局部放大/信息提示框)
Jan 08 Javascript
用jQuery模拟select下拉框的简单示例代码
Jan 26 Javascript
IE8中使用javascript动态加载CSS的解决方法
Jun 17 Javascript
jQuery之Deferred对象详解
Sep 04 Javascript
js中DOM三级列表(代码分享)
Mar 20 Javascript
Vue仿今日头条实例详解
Feb 06 Javascript
Vue.js实现表格渲染的方法
Sep 07 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
Dec 09 Javascript
node全局变量__dirname与__filename的区别
Jan 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
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
2014年10个最佳的PHP图像操作库
2014/07/14 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
2018/08/21 PHP
php探针不显示内存解决方法
2019/09/17 PHP
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
jQuery EasyUI API 中文文档 - ProgressBar 进度条
2011/09/29 Javascript
js innerHTML 改变div内容的方法
2013/08/03 Javascript
简介JavaScript中Boolean.toSource()方法的使用
2015/06/05 Javascript
基于jQuery实现的旋转彩圈实例
2015/06/26 Javascript
JS随机洗牌算法之数组随机排序
2016/03/23 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
Mobile Web开发基础之四--处理手机设备的横竖屏问题
2017/08/11 Javascript
基于Vue过渡状态实例讲解
2017/09/14 Javascript
深入研究React中setState源码
2017/11/17 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
Node.js调用fs.renameSync报错(Error: EXDEV, cross-device link not permitted)
2017/12/27 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
详解搭建一个vue-cli的移动端H5开发模板
2020/01/17 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
python实现的阳历转阴历(农历)算法
2014/04/25 Python
Python实现希尔排序算法的原理与用法实例分析
2017/11/23 Python
Python面向对象之类的内置attr属性示例
2018/12/14 Python
Python编程中类与类的关系详解
2019/08/08 Python
三个python爬虫项目实例代码
2019/12/28 Python
Python利用FFT进行简单滤波的实现
2020/02/26 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
2020/05/03 Python
Pytorch 使用CNN图像分类的实现
2020/06/16 Python
Python的控制结构之For、While、If循环问题
2020/06/30 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
5s标语大全
2014/06/23 职场文书
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
go 实现简易端口扫描的示例
2021/05/22 Golang
Python采集壁纸并实现炫轮播
2022/04/30 Python