Js函数节流与防抖

节流函数

在js开发中经常遇到事件频发触发的问题,例如监听屏幕上下滑动,频繁触发,这样会导致性能损耗,节流函数则可以缓解这个问题,通过节流函数,可以让时间在一定时间内,只响应一次,避免频繁触发。
在这里插入图片描述
原理如上图,原本我们在每个时间段都会触发一次方法,通过节流函数,在60ms内仅对第一次触发响应。

方法一 利用timeout延时器

    const throttle = (func,delay = 50) => {
        let timer = null;//保持timer
        return function() {
            if(!timer){//若timer = null 才触发
                func.call(this);//调用方法,并将指向纠正
                timer = setTimeout(()=>{
                   timer = null;//设置定时器 在delay时间内仅第一次调用生效
                },delay)
            }
        }
    };

通过闭包函数,保存timer状态,重复调用,通过timer状态判断是否应该执行方法

方法二 利用时间戳

    let throttle = (func,delay = 50) => {
        let timer = 0;//初始化timer
        return function() {
            if( new Date() - timer >= delay){//判断当前时间距离上次执行是否小于规定
                func.call(this);//调用方法,并将指向纠正
                timer = new Date();//为timer重新赋值 记录最新执行时间
            }
        }
    };

原理一致,延时时间改为时间戳判断

防抖函数

在开发中还会遇到一种情况,某一事件触发,一段时间内 只需要最后一次触发响应,例如表单验证,搜索功能,监听表单的改变,一定时间间隔内只监听最后一次表单改变,显示相关推荐信息,节省性能消耗。
在这里插入图片描述
如上图,一事件在1 2 步是分别触发事件但响应间隔小于要求,不响应,在第三步触发后,在规定事件内未再次触发,则响应事件。


const deBounce = (func, delay = 1000) => {
 let timer = null;
 return function (...args) {
   clearTimeout(timer); //清除定时器 重新记时
   timer = setTimeout(() => {
     func.apply(this, args);
   }, delay); //达到规定休眠时间,响事件
 };
};


只有大于100ms时间间隔的时间会响应

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值