浅谈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翻页效果
Jul 23 Javascript
高性能JavaScript模板引擎实现原理详解
Feb 05 Javascript
使用jquery实现仿百度自动补全特效
Jul 23 Javascript
javascript 数组的定义和数组的长度
Jun 07 Javascript
JS实现获取剪贴板内容的方法
Jun 21 Javascript
jQuery弹出层后禁用底部滚动条(移动端关闭回到原位置)
Aug 29 Javascript
JavaScript拖动层Div代码
Mar 01 Javascript
Vue中如何实现proxy代理
Apr 20 Javascript
vue 获取元素额外生成的data-v-xxx操作
Sep 09 Javascript
原生js实现购物车功能
Sep 23 Javascript
关于element的表单组件整理笔记
Feb 05 Javascript
ant design vue的form表单取值方法
Jun 01 Vue.js
简介可以自动完成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中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
TreeView 用法(有代码)(asp.net)
2011/07/15 Javascript
详解nodejs 文本操作模块-fs模块(三)
2016/12/22 NodeJs
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
JS时间控制实现动态效果的实例讲解
2017/07/31 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
详解使用React进行组件库开发
2018/02/06 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
vue通过数据过滤实现表格合并
2020/11/30 Javascript
[05:43]VG.R战队教练Mikasa专访:为目标从未停止战斗
2016/08/02 DOTA
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
分分钟入门python语言
2018/03/20 Python
tensorflow更改变量的值实例
2018/07/30 Python
浅谈python3发送post请求参数为空的情况
2018/12/28 Python
网易有道2017内推编程题 洗牌(python)
2019/06/19 Python
Python List列表对象内置方法实例详解
2019/10/22 Python
Django实现CAS+OAuth2的方法示例
2019/10/30 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
IFCHIC台湾:欧美国际设计师品牌
2019/05/18 全球购物
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
幼儿园大班毕业感言
2014/02/06 职场文书
药品采购员岗位职责
2014/02/08 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
作文批改评语
2014/12/25 职场文书
邀请函格式范文
2015/02/02 职场文书
学校世界艾滋病日宣传活动总结
2015/05/05 职场文书
为自己工作观后感
2015/06/11 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
2016母亲节感恩话语
2015/12/09 职场文书
Flask搭建一个API服务器的步骤
2021/05/28 Python
html5+实现plus.io进行拍照和图片等获取
2022/06/01 HTML / CSS