setTimeout与setInterval

基本概念与用法就忽略了。主要是使用这两个定时器可能出现的问题:

this

由setTimeout与setInterval调用的代码运行在与所在函数完全分离的执行环境上。这会导致,这些代码中包含的 this 关键字在非严格模式会指向 window (或全局)对象,严格模式下为 undefined,这和所期望的this的值是不一样的。

  • 在ES6中可以使用箭头函数来绑定外层this;
  • 要么就是用bind进行硬绑定。

setTimeout(fn,0)

一般浏览器有一个最小间隔,因此虽然设置的是0,但也会在这个最小间隔之后才执行操作。
不同浏览器的最小间隔不同,一般为4ms。

setInterval失帧

setInterval是每隔一定间隔就试图将回调函数放入任务队列中。但当主线程代码运行时间过长的时候,此时任务队列中的代码不能运行。当setInterval发现任务队列中还有未执行的回调函数时,就不会再将当前的回调函数放入队列中,因此会跳过某些帧

当使用setInterval()时,仅当没有该定时器的任何其他代码示例时,才将定时器代码添加到队列中。这确保了定时器代码加入到队列中的最小时间间隔为指定间隔

为了解决setInterval这个问题,可以使用setTimeout来代替setInterval:

setTimeout(function bar(){
    //一些代码
    setTimeout(bar,delay);
},delay);

这里setTimeout一定会在上一次回调的代码执行完毕后再定时下一次的代码,保证不会跳过某些帧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值