函数的节流与防抖

本文详细讲解了函数的防抖与节流概念,通过实例演示如何在Vue项目中实现防抖和节流,并介绍了闭包的作用。重点展示了在实际开发中如何使用这些技术来提升性能和用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数的节流与防抖


防抖

防抖是指在一定的时间内再次触发此事件,会清空上次的事件重新开始,如果制定的时间内没有再次触发,那么这个事件才会执行。

	function showLog() {
        console.log('show');
    }

    /*
    * 防抖 思路:
    * 先开启一个定时任务执行,定时任务完成后则清空;当再调用时,如果定时任务仍存在则清空原来任务,创建新的定时任务
    * */
    function debounce(fn, space) {
        let task = null;
        return function (){
            if(task) {
                clearTimeout(task);
            }
            task = setTimeout(fn.apply(this, arguments), space);
            /*apply() 方法调用一个具有给定this值的函数,以及以一个数组(或类数组对象)的形式提供的参数。
你也可以使用 arguments对象作为 argsArray 参数。 arguments 是一个函数的局部变量。

            */
        }
    }
    // 使用
    let debounceShowLog = debounce(showLog, 3000);
    debounceShowLog()


这里说一下闭包

var bibao = function () {
    var counter = 0;
    return function () {return counter += 1;}
};
var add=bibao()//此时的add接收的为 return counter+=1

console.log(add())
console.log(add())
console.log(add())
//结果为1 2 3

闭包的形成:内部函数引用了外部函数的数据(这里为 counter),因此在add=bibao(),则会把这个counter保存在add中,函数执行完,counter并不会被销毁。

注意: 为什么上面这段代码没有直接写的 function add (){…} 而是把function赋值给了变量add呢?
我们通常会想当然的认为每次调用 add() 都会重走一遍add()中的代码块, 但其实不然。
注意add方法中的return, 它return的并不是1,2,3这样的数值,而是return了一个方法,并且把这个方法赋值给了add变量。
那么在这个function自运行一遍之后,其实最后赋值给add的是return counter += 1 这段代码。
所以后面每次调用add() 其实都是在调用return counter += 1。
再结合文章之前所说的, 闭包会持有父方法的局部变量并且不会随父方法销毁而销毁, 所以这个counter其实就是来自于第一次function执行时创建的变量


在vue学习中使用防抖的案例

coderwhy的supermall项目中

//Home.vue
mounted () {
    // 3.监听item中图片加载完成

    const refresh = this.debounce(this.$refs.scroll.refresh,200)

    this.$bus.$on('itemImageLoad',()=>{
      // console.log('-----');
      // this.$refs.scroll.refresh()
      refresh()
    }) 
  },
  methods: {
      // 防抖函数
      // debounce(func,delay)
      debounce(func,delay){
        let timer = null;
        return function(...args){
          if(timer) clearTimeout(timer);
          timer =setTimeout(() => {
            func.apply(this,args)
          }, delay);
        }
      },
     }
//Score.vue
methods: {
      refresh(){
          console.log('refresh调用');
          this.scroll && this.scroll.refresh &&this.scroll.refresh()
      }

  }

节流

节流是指在一定的时间同一事件只会触发一次,只有超过了这个时间才会再次触发。

 /*
    * 节流 思路:
    * 先开启一个定时任务执行,定时任务完成后则清空,当再调用时,如果定时任务仍存在则不执行任何操作
    * */
    function throttle(fn, space) {
        let task = null;
        return function () {
            if(!task) {
                task = setTimeout(function () {
                    task = null;
                    fn.apply(this, arguments);
                }, space);
            }
        }
    }

    let throttleShowLog = throttle(showLog, 3000);


总的来说:任何东西被频繁的调用都有可能需要防抖或者节流去优化
在这里插入图片描述
参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值