【JS基础知识2】你是不是也傻傻分不清节流和防抖

本文介绍了前端开发中常用的节流和防抖概念,通过游戏场景解释其工作原理,并提供了JavaScript实现代码。作者分享了这两个技巧在实际项目中的应用场景,如事件处理和资源优化。
摘要由CSDN通过智能技术生成

大家好,我是小梅

作为在前端领域不断探索的一员,最近处于待业状态。现在开始在此记录准备面试的基础知识点。如果你也遇到了相同的问题,希望本文对你有帮助。


节流和防抖的实现,相信大家基本上都是直接使用lodash库提供的方法防抖和节流方法。但是面试的过程中总是容易被问到,本人对于这种定义相似的概念经常记不住,因此写下文章来加深印象。

节流:throttle。

想象成节约,既然要节约,怎么做到节约呢。那就是:频繁触发的事件,单位时间内只执行一次。用王者荣耀放技能来举例。由于大招的CD时间很长,所以放过一次要等很久,才能等到大招刷新(因此都是节约着使用大招,不轻易放)。这就是节流,单位时间内只能执行一次,只有冷静期过了,才能执行下一次。

应用场景:为啥要节流呢,那就是因为不想被频繁触发事件。因此可以用在resize事件、鼠标滑动。下拉加载(一直刷新但我不会一直发请求,节约资源嘛)等场景。

代码如下:

function throttle(fn, delay = 1000) {
  let timer = null;
  return function (...args) {
    if (timer !== null) {
      return
    }
    timer = setTimeout(() => {
      fn(args)
      timer = null;
    }, delay);
  }
}

// 时间间隔判断
function throttled1(fn, delay = 500) {
    let oldtime = Date.now();
    let calledOnce = false; // 标记函数是否已经被调用过
    
    return function (...args) {
        let newtime = Date.now();
        if (!calledOnce || newtime - oldtime >= delay) {
            fn(args);
            oldtime = newtime;
            calledOnce = true; // 标记函数已经被调用过
        }
    };
}
防抖:debounce

记住了节流,那么防抖的功能就是:连续触发的时间在单位时间内只执行最后一次。想象成王者荣耀中的回城,点击回城需要加载几秒钟才能完成回城的动作,如果这中间被打断了,那么就失效了,只能重新计时。只有在一定时间内没有被打断施法才能成功回城。

应用场景:搜索框搜索输入、文本编辑器实时保存。

代码如下:

function debounce(fn, delay = 500) {
  let timer = null;
  return function (...args) {
    if (timer !== null) {
      clearTimeout(timer)
    }
    timer = setTimeout(() => {
      fn(...args)
    }, delay)
  };
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值