深入理解javascript之高级定时器
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);
};
//只要代码是周期性运行的,都应该使用节流。
这样给用户的感觉并不会非常大,确是给浏览器降低了不少的压力。函数节流也是非常多框架经常使用的技巧之中的一个。
最新文章
- 浅析mongodb中group分组
- python 多线程和多进程基本写法
- OBJ Loader Source Code
- JSChart_页面图形报表
- JavaScript强化教程——Cocos2d-JS中JavaScript继承
- 仙人掌(cactus)
- ios 定位 监听是否跨入某个指定的区域
- [CF724B]Batch Sort(暴力,思维)
- 模拟实现兼容低版本IE浏览器的原生bind()函数功能
- The New Debugger
- C语言库函数大全及应用实例十四
- jQuery技巧大放送【转】
- 初入计算机图形学——BVH结构的实现
- css中的行高line-height
- java的设计模式 - 外观模式(Facade)
- Spring mvc参数类型转换
- 【转】IAR Embedded Workbench for ARM 8.22.1 基础使用教程
- linux下NFS实战
- python之斐波那契数列递归推导在性能方面的反思
- Hash值破解工具Hashcat使用
热门文章
- 使用MyEclipse编写Java程序
- mysql---左连接、右连接、内连接之间的差别与联系
- ThinkPHP5中find()和select()区别
- MailKit和MimeKit的.NET基础邮件服务
- Node+Deployd+MongoDB安装问题
- c# 之抽象属性
- tomcat动态查看服务器打印日志
- inception - resnet
- 用VUE做网站后台
- 运行npm start vue.js项目 出现 npm ERR! missing script: start 错误