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);
};
//只要代码是周期性运行的,都应该使用节流。

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

demo位置

深入理解javascript之高级定时器的更多相关文章

  1. 深入理解JavaScript定时机制和定时器注意问题

    容易欺骗别人感情的JavaScript定时器 JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不 ...

  2. STM32 TIM1高级定时器RCR重复计数器的理解

    STM32 TIM1高级定时器RCR重复计数器的理解 TIMx_RCR重复计数器寄存器,重复计数器只支持高级定时器TIM1和TIM8,下面看标准外设库的TIM结构体的封装: typedef struc ...

  3. 深入理解JavaScript运行机制

    深入理解JavaScript运行机制 前言 本文是写作在给团队新人培训之际,所以其实本文的受众是对JavaScript的运行机制不了解或了解起来有困难的小伙伴.也就是说,其实真正的原理和本文阐述的并不 ...

  4. 深入理解javascript原型和闭包系列

    从下面目录中可以看到,本系列有16篇文章,外加两篇后补的,一共18篇文章.写了半个月,从9月17号开始写的.每篇文章更新时,读者的反馈还是可以的,虽然不至于上头条,但是也算是中规中矩,有看的人,也有评 ...

  5. 深入理解JavaScript的闭包特性如何给循环中的对象添加事件

    初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...

  6. 深入理解javascript原型和闭包(1)——一切都是对象

    “一切都是对象”这句话的重点在于如何去理解“对象”这个概念. ——当然,也不是所有的都是对象,值类型就不是对象. 首先咱们还是先看看javascript中一个常用的函数——typeof().typeo ...

  7. 深入理解javascript原型和闭包(2)——函数和对象的关系

    上文(理解javascript原型和作用域系列(1)——一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; co ...

  8. 深入理解javascript原型和闭包(3)——prototype原型

    既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...

  9. 深入理解javascript原型和闭包(4)——隐式原型

    注意:本文不是javascript基础教程,如果你没有接触过原型的基本知识,应该先去了解一下,推荐看<javascript高级程序设计(第三版)>第6章:面向对象的程序设计. 上节已经提到 ...

随机推荐

  1. Linux 文件描写叙述符设置为非堵塞的方法

    通过fcntl设置文件描写叙述符属性 fcntl即F_SETFL,F_GETFL的使用,设置文件的flags,堵塞设置成非堵塞,非堵塞设置成堵塞(这连个在server开发中能够封装为基本函数) 1.获 ...

  2. 反弹木马——本质上就是一个开80端口的CS程序,伪造自己在浏览网页

    反弹端口型木马分析了防火墙的特性后发现:防火墙对于连入的链接往往会进行非常严格的过滤,但是对于连出的链接却疏于防范.于是,与一般的木马相反,反弹端口型木马的服务端(被控制端)使用主动端口,客户端(控制 ...

  3. [poj 2912] Rochambeau 解题报告 (带权并查集)

    题目链接:http://poj.org/problem?id=2912 题目: 题目大意: n个人进行m轮剪刀石头布游戏(0<n<=500,0<=m<=2000) 接下来m行形 ...

  4. Android 自定义viewpager 三张图片在同一屏幕轮播的效果

    github:https://github.com/nickeyCode/RoundImageViewPager 说实话不知道怎么描述这个效果,在网页上见得跟多,公司要求做这个效果得时候不知道怎么用文 ...

  5. Sql Server 基本数据类型

    第一大类:整数数据 bit:bit数据类型代表0,1或NULL,就是表示true,false.占用1byte. int:以4个字节来存储正负数.可存储范围为:-2^31至2^31-1. smallin ...

  6. 洛谷1005 【NOIP2007】矩阵取数游戏

    问题描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  7. PKU 2411 Mondriaan's Dream 状态DP

    以前做过这题,今天又写了一次,突然发现写了一个好漂亮的DFS……(是不是太自恋了 - -#) 代码: #include <cstdio> #include <cstring> ...

  8. Unity WebGL 窗口自适应

    unity 打包好WebGL后,用文本编辑器编辑打包生成的 index.html 文件 在生成的html里面修改代码     <script type="text/javascript ...

  9. linux学习之高并发服务器篇(二)

    高并发服务器 1.线程池并发服务器 两种模型: 预先创建阻塞于accept多线程,使用互斥锁上锁保护accept(减少了每次创建线程的开销) 预先创建多线程,由主线程调用accept 线程池 3.多路 ...

  10. C# 字符串 分割 反转 Base64

    "; //字符串 ToBase64 byte[] bytes = Encoding.Default.GetBytes(pwd); pwd = Convert.ToBase64String(b ...