首页 > 其他分享 >防抖和节流

防抖和节流

时间:2023-06-07 11:01:05浏览次数:28  
标签:防抖 const 节流 debounce timer 函数

目录

1 防抖

1.1 定义

防抖,延迟执行(当连续触发某事件时,不会立即执行,只有一定时间没有再触发才执行)

1.2 举例

比如:用户搜索的时候,输入文字一直调用api,给服务器造成很大的压力,这个时候就需要做防抖处理,等用户输完,不再输入(比如500ms没输入),这个时候再发起请求。

1.3 防抖函数

请参考:https://blog.csdn.net/qq_39908328/article/details/124151069

1.4 防抖函数及调用

//创建一个防抖函数debounce
function debounce(fn, delay, immediate = false, resultCallback) {
  // 1.定义一个定时器, 保存上一次的定时器
  let timer = null
  let isInvoke = false
  // 2.真正执行的函数
  const _debounce = function (...ages) {
      // 取消上一次的定时器
      if (timer) clearTimeout(timer)

      // 判断是否需要立即执行
      if (immediate && !isInvoke) {
        const result = fn.apply(this, ages)
        isInvoke = true
        resultCallback(result)
      } else {
        // 延迟执行
        timer = setTimeout(() => {
          // 外部传入的真正要执行的函数
          const result = fn.apply(this, ages)
          resultCallback(result)
          isInvoke = false
        }, delay)
      }
  }

  //_debounce是一个函数,函数也可以做为是一个对象,所以我们可以给他添加方法
  _debounce.cancel = function () {
    if (timer) clearTimeout(timer)
    timer = null
    isInvoke = false
  }

  return _debounce
}

// 自己需要执行的函数
function myFun(e){
  console.log('input', e)
}

// 用防抖函数调用
输入框.oninput = debounce(myFun, 1000);

2 节流

2.1 定义

节流,立即执行,节流周期中重复触发也不再执行。

2.2 举例

比如:用户下拉加载更多的时候,如果不做节流,会频繁请求,如果进行节流处理,那么第一次会发起请求,然后再设置一个等待期(比如500ms),那这个等待期没结束的话,再次发起请求都不处理。

2.3 节流函数

请参考:https://blog.csdn.net/qq_39908328/article/details/124151069

1.4 节流函数及调用

function throttle(fn, interval, options = { leading: true, trailing: false }) {
  // 1.记录上一次的开始时间
  const { leading, trailing } = options
  let lastTime = 0
  let timer = null

  // 2.事件触发时, 真正执行的函数
  const _throttle = function (...args) {
    // 2.1.获取当前事件触发时的时间
    const nowTime = new Date().getTime()
    if (!lastTime && !leading) lastTime = nowTime

    // 2.2.使用当前触发的时间和之前的时间间隔以及上一次开始的时间, 计算出还剩余多长事件需要去触发函数
    const remainTime = interval - (nowTime - lastTime)
    if (remainTime <= 0) {
      //进入到这我们肯定会调用函数的,所以需要防止重复调用
      if (timer) {
        clearTimeout(timer)
        timer = null
      }

      // 2.3.真正触发函数
      fn()

      // 2.4.保留上次触发的时间
      lastTime = nowTime
      return
    }

    //判断是否需要执行最后一次输出
    if (trailing && !timer) {
      timer = setTimeout(() => {
        timer = null
        //防止我们延迟调用函数时,上面时间到了后,又重复调用
        lastTime = !leading ? 0 : new Date().getTime()
        fn()
      }, remainTime)
    }
  }

  return _throttle
}

// 自己需要执行的函数
function myFun(e){
  console.log('scroll', e)
}

// 用防抖函数调用
Window.onscroll = throttle(myFun, 1000);

3 总结

总之,防抖是延迟执行,节流是立即执行

标签:防抖,const,节流,debounce,timer,函数
From: https://www.cnblogs.com/xihailong/p/17462547.html

相关文章

  • 【网络基础】【HTTP】如何理解是 TCP 面向字节流协议?
    1  前言TCP是面向字节流的协议,UDP是面向报文的协议?这里的「面向字节流」和「面向报文」该如何理解。我们这节来看看哈。2  如何理解字节流?之所以会说TCP是面向字节流的协议,UDP是面向报文的协议,是因为操作系统对TCP和UDP协议的发送方的机制不同,也就是问题原因在发......
  • 防抖函数
    习题链接防抖函数课程列表当一个函数在一定时间内被连续调用多次时,只执行最后一次调用,并在最后一次调用后延迟一定时间再执行。关键点setTime()定时器创建一个变量来存储定时器每次执行函数的时候,都要先清除上一次的定时器,以达到只执行最后一次调用闭包的概念,因为每一......
  • js防抖和节流
    1.什么是节流(throttle)和防抖(debounce)概念节流(throttle):是函数在一定时间内,不管调用了多少次,实际只会在最后的时候执行一次防抖(debounce):是函数在一定时间内,每次调用,都会重置倒计时,直到规定时间内没有再次调用,才会执行区别这里以关门当作函数执行前等待时间时的操作;以发车......
  • 防抖和节流的应用
    防抖(debounce)和节流(throttle)是优化高频触发事件的技术,它们可以提高性能,避免不必要的计算和函数执行。以下是一些实际场景的示例:防抖(Debounce):防抖用于确保一个函数在一定时间内只触发一次。它在短时间内多次触发同一个事件时,会取消之前的触发,直到最后一次触发后的一定时间间隔内......
  • 防抖和节流
    卡顿现象//正常情况(用户慢慢的操作):鼠标进入,每一个一级分类h3,都会触发鼠标进入事件//非正常情况(用户操作很快):本身全部的一级分类都应该触发鼠标进入事件,但是经过测试,只有部分h3触发了//就是由于用户行为过快,导致浏览器反应不过来。如果当前回调函数中有一些大量业务,有可能出......
  • 防抖
    <script>functionTest(fn,delay){lettimer=null;returnfunction(){if(timer){clearTimeout(timer);}timer=setTimeout(fn,delay);}}window.o......
  • JS高级(作用域,原型链,闭包,节流,防抖等概念性)
    作用域局部作用域函数作用域在函数内部声明的变量只能在函数内部被访问,外部无法直接访问块作用域let和const声明的变量会产生块作用域,var不会产生块作用域,推荐使用let和const全局作用域在<script>和.js文件的最外层就是全局作用域,在此声明的变量在其他任何作用域都可以被......
  • 下载文件(Excel)功能,后端返回blob字节流,前端怎么处理?
    在做大屏数据项目有个报表下载的功能,根据用户选择的时间下载对应时间的报表,后端返回的是文件流,前端需要怎么去处理呢?实现的功能效果: 后端返回的数据:需要我们处理的乱码:前端代码:1exportExcel(){2axios({3methods:"xxxx",4url:"xxx/xxxx/xx......
  • lazyload&防抖动和节流阀
    title:07-自定义按键修饰符&自定义指令publish:falselazyload用的最多的场景是:图片lazyload组件lazyload现在一般都单独做css的lazyload或者js的lazyload,因为这种方式,其实还是要加载图片和组件。图片lazyload图片一般是页面最大的资源,所以非首屏延迟加载很重要(......
  • 防抖和节流
    1.debounce(防抖)和throttle(节流)的定义口语版:防抖就是只有当小明连续10天不捣蛋时,小明爸爸才给他零花钱。如果在这10天内小明捣蛋了,那么重新计算,直到满足了10天不捣蛋的条件,小明爸爸才给零花钱。一年下来小明居然只拿到了5次零花钱,你说气人不?节流就是无论小明捣蛋不捣蛋,小明......