JavaScript的限流防抖

在JavaScript中,当一个事件被频繁触发,并且处理函数比较耗资源时,往往容易造成性能问题影响用户体验

例如,当用户缩放或滚动页面时执行大量的计算,将可能导致页面卡顿,甚至页面异常退出

这时就需要限流,即限制处理函数的执行频率

/**
 * 限流函数: 连续调用时,限制函数单位时间内只被执行一次。
 * @param { function } fn
 * @param { number } interval 时间间隔(ms)
/
function throttle(fn, interval){
   if('number' != typeof interval && !(interval instanceof Number)){
        throw new TypeError('第二个参数是时间间隔(ms),请输入整数);
        return;
    }
    let lastTime = 0;
    return wrapper(){
        let pastTime = Date.now() - lastTime;
        let self = this;
        let args = arguments;
        function exec(){
            lastTime = Date.now();
            fn.apply(self, args);
        }
        if(pastTime > interval){
            exec();
        }
    }
}

频繁地触发事件,除了可能产生性能问题,还容易导致重复执行不必要的处理

例如,用户频繁地点击按钮,容易导致重复提交请求。

另外,用户在输入框连续输入时,频繁地触发请求,实际只有最后一次请求才是有效的。

这时就需要防抖,即限制函数只被执行一次

/**
 * 防抖函数: 连续调用时,限制函数只被执行一次。
 * @param { function } fn
 * @param { number } interval 时间间隔(ms)
 * @param { boolean } atBegin 是否第一次执行
/
function debounce(fn, interval, atBegin=true){
   if('number' != typeof interval && !(interval instanceof Number)){
        throw new TypeError('第二个参数是时间间隔(ms),请输入整数);
        return;
    }
    let timeoutID = undefined;
    return wrapper(){
        let self = this;
        let args = arguments;
        function exec(){
            fn.apply(self, args);
        }
        function clear(){
            timeoutID = undefined;
        }
        if(atBegin && !timeoutID){
            exec();
        }
        if(timeoutID){
            clearTimeout(timeoutID);
        }
        timeoutID = setTimeout(atBegin ? clear() : exec(), interval);
    }
}

限流和防抖都是用来处理频繁事件的。频繁地触发事件,容易产生性能问题,这时就需要限流,即限制函数执行频率。另外,还可能导致重复执行和不必要的处理,这种需要防抖,即限制函数只执行一次。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript中可以使用定时器来实现节流和防抖的效果。下面是一些基本的实现示例: 1. 节流实现: ```javascript function throttle(func, delay) { let timer = null; return function() { if (!timer) { timer = setTimeout(() => { func.apply(this, arguments); timer = null; }, delay); } }; } ``` 使用示例: ```javascript function handleScroll() { console.log('Scroll event'); } const throttledScroll = throttle(handleScroll, 200); window.addEventListener('scroll', throttledScroll); ``` 上述代码中,`throttle`函数接受一个函数和一个延迟时间作为参数,返回一个新的函数。这个新的函数在被调用时,如果定时器不存在,则设置一个定时器,并在延迟时间后执行传入的函数。如果定时器已经存在,则不执行传入的函数。 2. 防抖实现: ```javascript function debounce(func, delay) { let timer = null; return function() { clearTimeout(timer); timer = setTimeout(() => { func.apply(this, arguments); }, delay); }; } ``` 使用示例: ```javascript function handleInput() { console.log('Input event'); } const debouncedInput = debounce(handleInput, 500); inputElement.addEventListener('input', debouncedInput); ``` 上述代码中,`debounce`函数接受一个函数和一个延迟时间作为参数,返回一个新的函数。这个新的函数在被调用时,会先清除之前的定时器,然后设置一个新的定时器,并在延迟时间后执行传入的函数。 这些是基本的节流和防抖实现示例,你可以根据实际需求进行调整和扩展。希望对你有所帮助!如果还有其他问题,请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值