手写一个setInterval

setInterval定时器的一些问题

// setInterval的所用是每隔一段指定的时间执行一个函数,但是这个执行不是真的到了时间立即执行,
// 它真正的作用是每隔一段时间将事件加入事件队列中去,只有当前的执行栈为空的时候,才能去从事件
// 队列中取出事件执行。所以可能会出现这样的问题,就是当前执行栈执行的时间很长导致事件队列里面
// 累积多个定时器加入的事件,当执行栈结束的时候,这些事件会依次执行,因此就不能做到每隔一段时间
// 执行的效果了
// 针对setInterval的这个缺点,我们可以使用setTimeout递归调用来模拟 setInterval,这样我们确保了只有一个事件
// 结束了,我们才会触发下一个定时器事件,这样解决了 setInterval 的问题


// 模拟setInterval
    function mySetInterval(fn, delay, ...args) {
      const timer = { flag: true }
      function interval() {
        if (timer.flag) {
          fn(...args)
          setTimeout(() => {
            interval()
          }, delay)
        }
      }
      setTimeout(() => {
        interval()
      }, delay)
      return timer
    }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值