setTimeout倒计时 setInterval相关 问题

setInterval 问题
有错误不会停止
多个定时器代码执行之间的间隔可能会比预期小
间隔会被跳过

要求用闭包实现每隔5s输出0-9之间的十个数字

   (function timer (){
     var i = 0
     setTimeout(function() {
       console.log(i)
       i++
       if(i< 10 ){
         setTimeout(arguments.callee, 1000);
       }
     }, 1000);
   }
   )()

递归调用

 function b (num){
  if(num > 0 ){
    setTimeout(function(){
      console.log(num)
      num --
      b (num)
    },1000)
  }
  }

执行环境
执行环境定义了变量和函数的有权访问的其他数据,决定各自的行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个变量对象中。
作用域链
函数在定义时创建的,

计时器


正计时 倒计时
根据传入 order  : down 倒计时
				 up  正计时

  const countDown = (order: string, miu?: number) => {
    // order >> down倒计时 up计时
    let counter: any = '';
    clearTimeout(intervalRef.current);
    let timeCount = 0;
    //倒计时
    let ms = miu ? miu * 1000 : 0;
    const interval = 1000,
      startTime = new Date().getTime(); //执行时间
    counter = setTimeout(countDownStart, interval);
    intervalRef.current = counter;
    function countDownStart() {
      timeCount++;
      //程序运行到此并没有做倒计时作用 会产生时间误差
      let offset = new Date().getTime() - (startTime + timeCount * interval);
      //清除时间误差
      let nextTime = interval - offset;
      // 误差超过一秒立即执行 避免长时间 大误差
      if (nextTime < 0) {
        nextTime = 0;
      }
      if (order === 'down') {
        ms -= interval;
        if (ms < 0) {
          clearTimeout(intervalRef.current);
     
        } else {
          let minute = Math.floor(ms / 1000 / 60);
          let second = Math.floor((ms / 1000) % 60);
         	console.log(minute ,second  )
          counter = setTimeout(countDownStart, 1000);
          intervalRef.current = counter; //清除定时器用 得到的是定时的id
        }
      } else {
        ms += interval;
        let minute = Math.floor(ms / 1000 / 60);
        let second = Math.floor((ms / 1000) % 60);
       	console.log(minute ,second  )
        counter = setTimeout(countDownStart, 1000);
        intervalRef.current = counter; //清除定时器用 得到的是定时的id
      }
    }
  };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值