五分钟了解防抖和节流

防抖

  • 场景

当实现滚动监听的时候,发现每滚动一次滚动条,这个监听时间执行了十来次,如果这样子实现太过于浪费性能,所以就出现了防抖。

  • 那么这个问题怎么优化呢?

当我们滚动监听第一次触发的时候不是立即执行函数,而是给它一个delay延迟时间,比如200ms

  1. 当在200ms内如果没有触发该事件,则执行函数
  2. 在200ms再次或者多次触发,都清空定时器,重新设置定时器知道过了delay时间后才执行函数。

大概思路是这样,那么应该怎么用代码来实现呢,用setTimeout来实现定时器的功能

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

const showTop = () => {
    console.log('scrollTop', document.body.scrollTop);
};

document.body.onscroll = debounce(showTop, 1000);

节流

  • 场景

监听滚动条,只要滚动函数就会执行,有时候执行了十来次,这个时候就需要优化。

  • 怎么优化呢,接下来说一下实现思路

让函数执行一次后,在某个时间段内暂时失效,等过了这个时间段再激活生效。

短时间内大量触发同一事件,函数执行一次后再指定的时间内不会再执行,等到过了指定的时间段后才会重新生效。

  • 代码实现 状态位/setTimeout
// 状态位实现
function throttle(fn, delay) {
    let valid = true;
    return () => {
        if (!valid) return false;
        valid = false; // 执行函数,状态设置为无效
        setTimeout(() => {
            fn();
            valid = true; // 函数执行完毕,状态激活
        }, delay);
    }
}


// setTimeout实现
function throttle(fn, delay) {
    let timer = null;
    return () => {
        if (!timer) {
            timer = setTimeout(() => {
                fn();
                timer = null;
            }, delay)
        }
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值