详解javascript高级定时器


Posted in Javascript onDecember 31, 2015

setTimeout()和setInterval()可以用来创建定时器,其基本的用法这里就不再做介绍了。这里主要介绍一下javascript的代码队列。在javascript中没有任何代码是立即执行的,一旦进程空闲则尽快执行。所以说定时器中设置的时间并不代表执行时间就一定相符,而是代表代码会在指定时间间隔后加入到队列中进行等待。如果在这个时间点上,队列中没有其他东西,那么这段代码就会被执行,表面上看上去好像代码就在精确指定的时间点上执行了。所以就会产生一些问题。

重复定时器

通常,我们使用setInterval方法来以相同时间间隔重复执行某段代码。但是使用该方法会有两个问题:第一个就是某些间隔会被跳过;第二个就是多个定时器的代码执行之间的间隔可能会比预期的小。
在这里,我们来举个例子:如果某个onclick事件处理程序使用setInterval设置了一个200ms间隔的重复定时器,如果事件处理程序花了300ms的时间完成,就会跳过一个时间间隔同时运行着一个定时器代码。
我们也可以通过下面的代码来得到结论:

//重复定时器
var i =0;
setInterval(function(){
 //如果事件处理时间长于间隔时间
 i++;
 for(var j=0;j<100000000;j++){}
 document.write(i+' ');
},100);
//可以明显感觉到时间间隔不相等
为了避免这种时间间隔的问题,我们可以采用链式调用setTimeout方法来取代setInterval。

//可以采用链式调用setTimeout来取代setInterval
var i = 0;
setTimeout(function(){
 //处理内容
 i++;
 for(var j=0;j<100000000;j++){}
 document.write(i+' ');
 //
 setTimeout(arguments.callee,100);
},100);
//这样处理效果明显好多了。

每次函数执行的时候都会创建一个新的定时器,第二个setTimeout调用使用了arguments.callee来获取对当前执行的函数的引用,并为其设置另外一个定时器。这样做是为了在前一个定时器代码执行完之前,不会向队列插入新的定时器代码,确保不会有任何缺失的间隔,也保证了在下一次定时器代码执行之前,至少要等待指定的间隔,避免了连续的运行。可谓一举两得,现在主流框架中的动画一般都是这样来实现重复定时的。

函数节流

定时器不仅仅是用来定时的,也可以用来缓解浏览器的压力。浏览器中某些计算和处理要比其他的昂贵很多,比如说DOM操作,就会需要更多的内存和CPU时间,连续使用过多的DOM操作可能会导致浏览器挂起,甚至崩溃。
函数节流的基本思想就是,某些代码不可以在没有间断的情况连续重复执行。第一次调用函数,创建一个定时器,在指定的时间间隔之后运行代码。当第二次调用该函数时,它会清除前一次的定时器并设置一个。目的就是为了在执行函数的请求停止一段时间后再执行。
代码如下:

//再来谈谈函数节流
function throttle(method,context){
 clearTimeout(method.tId);
 method.tId = setTimeout(function(){
  method.call(context);
 },100);
}
//该函数接受两个参数,第一个是要执行的函数,第二个是作用域。
//使用方法demo
//未使用情况:
window.onresize = function(){
 var div = document.getElementByTagName(body);
 div.style.height = div.offsetWidth +'px';
}
//使用情况;
function resizeDiv(){
 var div = document.getElementByTagName(body);
 div.style.height = div.offsetWidth +'px';
}
window.onresize = function(){
 throttle(resizeDiv);
};
//只要代码是周期性执行的,都应该使用节流。

这样给用户的感觉并不会很大,确是给浏览器减少了不少的压力,函数节流也是很多框架常用的技巧之一。

以上就是关于javascript高级定时器的相关介绍,希望对大家的学习有所帮助。

Javascript 相关文章推荐
Javascript中的常见排序算法
Mar 27 Javascript
JS 自动完成 AutoComplete(Ajax 查询)
Jul 07 Javascript
Javascript 自定义类型方法小结
Mar 02 Javascript
广泛收集的jQuery拖放插件集合
Apr 09 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
Jan 06 Javascript
js获取指定日期周数以及星期几的小例子
Jun 27 Javascript
深入探寻javascript定时器
Jan 02 Javascript
jQuery中DOM树操作之复制元素的方法
Jan 23 Javascript
详解AngularJS中的表格使用
Jun 16 Javascript
javascript实现网页背景烟花效果的方法
Aug 06 Javascript
详解JavaScript的另类写法
Apr 11 Javascript
详解Vue.js Mixins 混入使用
Sep 15 Javascript
jQuery动画效果相关方法实例分析
Dec 31 #Javascript
js实现文字垂直滚动和鼠标悬停效果
Dec 31 #Javascript
jquery正则表达式验证(手机号、身份证号、中文名称)
Dec 31 #Javascript
jQuery语法小结(超实用)
Dec 31 #Javascript
解决JS无法调用Controller问题的方法
Dec 31 #Javascript
简单谈谈JavaScript的同步与异步
Dec 31 #Javascript
jQuery实现简单的图片查看器
Sep 11 #Javascript
You might like
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
2007/02/22 PHP
在PHP中使用Sockets 从Usenet中获取文件
2008/01/10 PHP
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
php 变量引用与变量销毁机制详细介绍
2016/12/05 PHP
js确定对象类型方法
2012/03/30 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
2015/02/23 Javascript
基于jquery实现复选框全选,反选,全不选等功能
2015/10/16 Javascript
JS Array.slice 截取数组的实现方法
2016/01/02 Javascript
Javascript在IE和Firefox浏览器常见兼容性问题总结
2016/08/03 Javascript
jQuery制作图片旋转效果
2017/02/02 Javascript
Angular中使用$watch监听object属性值的变化(详解)
2017/04/24 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
在Vue 中使用Typescript的示例代码
2018/09/10 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
JS精确判断数据类型代码实例
2019/12/18 Javascript
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
2020/09/28 Javascript
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
异步任务队列Celery在Django中的使用方法
2018/06/07 Python
如何使用Python 打印各种三角形
2019/06/28 Python
利用python计算windows全盘文件md5值的脚本
2019/07/27 Python
pytorch实现特殊的Module--Sqeuential三种写法
2020/01/15 Python
用sleep间隔进行python反爬虫的实例讲解
2020/11/30 Python
Kaufmann Mercantile官网:家居装饰、配件、户外及更多
2018/09/28 全球购物
创意爱尔兰礼物:Creative Irish Gifts
2020/01/29 全球购物
介绍一下SQL Server的全文索引
2013/08/15 面试题
2014年保育员个人工作总结
2014/12/02 职场文书
2015年网络管理员工作总结
2015/05/21 职场文书
晚会开场白和结束语
2015/05/29 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
完美解决golang go get私有仓库的问题
2021/05/05 Golang
Django路由层如何获取正确的url
2021/07/15 Python
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python
Golang 入门 之url 包
2022/05/04 Golang
V Rising 服务器搭建图文教程
2022/06/16 Servers
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript