多版本防抖节流

文章介绍了防抖(debounce)和节流(throttle)两种优化技术在JavaScript中的实现方法,包括普通版、自执行函数版和Vue3版。防抖用于限制函数的执行次数,而节流则控制函数执行的频率,常用于处理如窗口滚动、输入搜索等高频事件。
摘要由CSDN通过智能技术生成

防抖

普通防抖
functiondebounce(fn, delay=200) {
    // 记录上⼀次的延时器
    vartimer=null;
    returnfunction (...args) {
        // 清除上⼀次延时器
        timer&&clearTimeout(timer);
        timer=setTimeout(() => {
            fn.apply(this, args);
        }, delay);
    }
}
自执行函数版
constdebounce= (() => {
    lettimer=null;
    return (fn, delay=200) => {
        timer&&clearTimeout(timer);
        timer=setTimeout(fn, delay);
    }
})()
vue3版
functiondebounce(fn, delay=300) {
    // 记录上⼀次的延时器
    vartimer=null;
    return (function (...args) {
        timer&&clearTimeout(timer);
        timer=setTimeout(() => {
            fn.apply(this, args);
        }, delay);
    })();
}
使用防抖
methods: {
    loadList() {
        debounce(() => {
            console.log('加载数据')
        }, 500)
    }
}

节流

定时器版
functionthrottle(fn, delay=300){
    lettimer=null;
    returnfunction(...args) {
        if (!timer) {
            timer=setTimeout(() => {
                fn.apply(this, args);
                clearTimeout(timer);
                timer=null;
            }, delay)            
        }
    }
}
​
functionthrottle(fn, delay=300) {
    letisThrottling=false
    // 核心思路,函数多次执行只有当 isThrottling 为 false 时才会进入函数体
    returnfunction (...args) {
        if (!isThrottling) {
            isThrottling=true;
            setTimeout(() => {
                isThrottling=false;
                fn.apply(this, args);
            }, delay)
        }
    }
}
时间戳版
functionthrottle(fn, delay=200){
    varlastTime=Date.now();
    returnfunction (...args) {
        varnowTime=Date.now();
        if (nowTime-lastTime>delay) {
            lastTime=nowTime;
            fn.apply(this, args);
        }
    }
}
vue3版
functionthrottle(fn, delay=300) {
    varlastTime=Date.now();
    return (function (...args) {
        varnowTime=Date.now();
        if (nowTime-lastTime>delay) {
            lastTime=nowTime;
            fn.apply(this, args);
        }
    })();
}
使用节流
methods:{
    appSearch:debounce(function(){
        this.getList()
    },300)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值