防抖与节流,以及它们之间的区别

7 篇文章 0 订阅
关于防抖与节流在网上也是众说纷纭,今儿个说一下个人的理解与总结。可能说的不对仅供参考。
  1. 什么是防抖?
    触发高频率事件时n秒后只会执行一次回调,如果n秒内再次触发,则会重新计算时间。
    概述:每次触发时都会取消之前的延时调用。并从新计算
    使用场景:如内容模糊搜索时的搜索联想
    总结:在多次触发或者多次调用时,只执行最后一次

  2. 什么是节流?
    概述:不管事件怎么触发,回调只会在一定时间后才会继续执行,
    使用场景:这里以手写轮播图为例,假设你现在写了一个轮播图,那么如果一直点上一页或者下一页就会有大量的切换,可能导致切换的过度动画卡顿,如果有定时器还会开启大量的定时器,那么就限制一下,只有当前切换操作完成后或者切换过度结束后才可以继续切换下一张,这个时候就可以用节流来限制,当然也可以使用过渡事件transitionend来处理办法有很多。
    总结:在指定时间内只执行一次,(如果觉得我说的太抽象,在内容最后我打个比方来具体描述一下节流的作用和用途)

  3. 两者的区别:1 在高频触发或调用时只执行最后一次,2 在指定时间内只执行一次

上代码,不然空口无凭

防抖

      /**
       * 使用闭包原理实现防抖函数的封装
       * Callback 回调
       * delayTime 定时器执行时间
       */
      function debounceEvent(Callback, delayTime) {
        let timer = null
        return function (...agmes) {
          if (timer) clearTimeout(timer)
          timer = setTimeout(() => {
            Callback.apply(this, [...agmes])
          }, delayTime)
        }
      }
	  document.querySelector('input').oninput = debounceEvent(function (event) {
        console.log(this.value)
      }, 500)

节流

      /**
       * 使用闭包封装节流函数
       * Callback 回调
       * delayTime 间隔执行的时间/秒
       */
      function throttleEvent(Callback, delayTime) {
        // 上一次执行的时间,
        let constTime = 0
        // 可以认为时节流的阀门。
        let valve = false
        return function (...agmes) {
          let createTime = new Date().getTime()
          let day = (createTime - constTime) / 1000
          valve = !constTime || day > delayTime ? true : false
          if (valve) {
            Callback.apply(this, [...agmes])
            constTime = createTime
          }
        }
      }
	  document.querySelector('input').oninput = throttleEvent(function (event) {
        console.log(this.value)
      }, 3)

假设现在你家有一个水龙头,然后在你家还有一个控制水的总开发,总阀门。现在天气太热了限水了,你每次放水后总开关(阀门)就会自动关闭,关闭时间为10秒,10秒后总开关(阀门)会自动打开。 只有当阀门开启时,你才能放出水来。
怎么样,是不是很生动形象,哇哈哈我是逻辑鬼才,

点赞不迷路,不点赞踩我一下也行,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值