js里面的Timer

一、Timer

js里面提供了两个用来定时执行代码的函数:setTimeoutsetInerval,统称为Timer.

 

二、初级印象

setTimeout( func|string, time )在一定时间后执行代码

setInterval( func|string, time)每隔一段时间后执行代码

 

三,参数解析

(一)、func | string

1,这两个计时器都可以接收一个函数对象或者一段字符串,

当接收字符串的时候,会通过eval()函数进行解析,

而在执行时,不管是函数对象还是解析后的字符串,此时的上下文都是window

 

3-1

数字为setTimeout产生的计时器id,通过打印的window可知,此时函数执行的上下文为window

2,新版浏览器允许在time后继续接收参数,并传入func

考虑向下兼容,可以通过

func.call( undefined, arg1, arg2...)或者

func.apply( undefined, [arg1, arg2...])来实现

(二)、time

1,添加的时机

js是单线程、异步执行的,其事件处理机制叫做event loop

js引擎遇到setTimeoutsetInterval、或者外部事件触发等,会通知不同的线程去操作,完成后往事件队列末尾添加任务,等待js引擎的顺序执行。

 

3-2,来自这里

所以,Timer的正确理解应该是:

/每隔一定时间,将该任务添加到事件队列末尾

2,带来的影响

由于任务队列的不确定性,永远无法保证按照设定的时机执行任务!

 

3-3

 

3-4

 

四、setInterval本身的缺陷

通过上面分析知道,setInterval是每隔一定时间往事件队列末尾添加任务,扣掉事件本身的执行时间,从上一个事件结束到下一个事件开始的事件差,永远小于设定的time,此时可以通过setTimeout进行改进。

原来的setInterval( func, time )可以变为

var temp = setTimeout( function() {
func();

setTimeout(temp, time);

}, time);

temp();

当然,这是在假设了期间不再有新的事件加入的前提下

 

五、清除Timer

每次setTimeout或者setInterval,都会产生一个唯一的计时器id,通过清理该id即可以清理相应的计时事件。

本来各自对应的clearTimeoutclearInterval,竟然可以混用!

 

5-1

 

5-2

 

参考文献:

1http://www.cnblogs.com/fly-snow/archive/2016/04/24/5427865.htm

2http://www.open-open.com/lib/view/open1452474629745.html

3http://www.open-open.com/lib/view/open1452440157401.html

4http://www.css88.com/archives/5804

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值