防抖与节流

防抖与节流

防抖

事件触发后经过规定时间再执行,规定时间内,多次触发,每次触发导致重新计时,以最后一次触发为准,规定时间内都没有再次触发就执行。

实现
function debounce(fn, delay) {
    let timer = null;
    return function (...args) {
        let context = this;
        if(timer) clearTimeout(timer);
        timer = setTimeout(function() {
            fn.apply(context, args);
        }, delay);
    }
}

节流

规定时间内,只执行一次,多次触发不生效,只有规定时间过去执行完毕,才开始下一轮计时。

实现
function throttle(fn, delay) {
    let flag = true;
    return function (...args) {
        let context = this;
        if (!flag) return;
        flag = false;
        setTimeout(() => {
            fn.apply(context, args);
            flag = true;
        }, delay);
    }
}

function throttle(fn, delay) {
    let last = new Date().getTime();
    return function (...args) {
        let context = this;
        let now = new Date().getTime();
        if(now - last < delay) return;
        last = now;
        fn.apply(this, args)
    }
}

防抖+节流

实现
function throttle(fn, delay) {
    let last = new Date().getTime(), timer = null;
    return function (...args) {
        let context = this;
        let now = new Date().getTime();
        if(now - last < delay){
            clearTimeout(timer);
            timer = setTimeout(function() {
                last = now;
                fn.apply(context, args);
            }, delay);
        } else {
            // 过了规定时间必然触发一次,防止由于总是防抖导致一直无法触发
            last = now;
            fn.apply(context, args);
        }
    }
}

测试

在这里插入图片描述

参考

如何实现事件的防抖和节流?

7分钟理解JS的节流、防抖及使用场景

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值