setInterval与setTimeout的区别

setTimeout和setInterval的相同点,都包含两个参数,一个是将要执行代码的字符串,一个是以毫秒为单位的时间间隔,经过指定时间间隔之后就会执行指定的代码。
setInterval与setTimeout的区别:setTimeout只执行一次指定代码,而setInterval在执行完一次代码之后,经过了那个固定的时间间隔,它还会自动重复执行代码。
window.setTimeout(“function”,time);//执行一次指定代码,无周期。使用clearTimeout清除定时器对象,
window.setInterval(“function”,time);//不断地执行指定代码直到调用clearInterval清除定时器对象,执行周期=指定的时间time
停止定时:
window.clearTimeout(对象) 清除已设置的setTimeout对象
window.clearInterval(对象) 清除已设置的setInterval对象


在使用过程需注意:
javascript是以单线程的方式运行于浏览器的javascript引擎中的,setTimeout和setInterval的作用只是把你要执行的代码在你设定的一个时间点插入js引擎维护的一个代码队列中,插入代码队列并不意味着你的代码就会立马执行。先来看两个例子理解下:

setTimeout :

function click() { 
// code block1... 
setTimeout(function() { 
// process ... 
}, 200); 
// code block2 
} 

假设我们给一个button的onclick事件绑定了此方法, 当我们按下按钮后, 肯定先执行block1的内容,然后运行到setTimeout的地方,setTimeout会告诉浏览器说,”200ms后我需要插入一段代码到代码队列中”, 浏览器当然答应了(注意插入到代码队列中并不意味着立马执行),setTimeout代码运行后,紧跟其后的block2代码开始执行, 需要注意的是,如果block2的代码执行时间超过200ms, 那结果会是如何? 或许按照你之前的理解,会理所当然的认为200ms一到, 你的process代码会立马执行…事实是,在block2执行过程中(执行了200ms后)process代码被插入代码队列,但一直要等click方法执行结束, 才会执行process代码段, 从代码队列上看process代码是在click后面, 再加上js以单线程方式执行, 所以应该不难理解。 如果是另一种情况,block2代码执行的时间<200ms, setTimeout在200ms后将process代码插入到代码队列, 而那时执行线程可能已经处于空闲状态了,那结果就是200ms后, process代码插入队列就立马执行了, 就让你感觉200ms后, 就执行了。

setInterval :
这里可能会存在两个问题:
1.时间间隔或许会跳过
2.指定时间间隔可能<定时调用的代码的执行时间

function click() { 
// code block1... 
setInterval(function() { 
// process ... 
}, 200); 
// code block2 
} 

和上面一样我们假设通过一个click,触发了setInterval以实现每隔一个时间段执行process代码。
这里写图片描述
比如click要300ms执行完,block1代码执行完需要5ms,在5ms时执行setInterval,以此为一个时间点, 在205ms时插入process代码, click代码顺利结束, process代码开始执行(相当于图中的timer code), 然而process代码也执行了一个比较长的时间, 超过了接下来一个插入时间点405ms, 这样代码队列后又插入了一份process代码, process继续执行着, 而且超过了605ms这个插入时间点, 下面问题来, 可能你还会认为代码队列后面又会继续插入一份process代码…真实的情况是,由于代码队列中已经有了一份未执行的process代码, 所以605ms这个插入时间点将会被”无情”的跳过, 因为js引擎只允许有一份未执行的process代码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值