实现函数的防抖与节流

函数防抖

如果一个事件被频繁触发多次,并且触发的时间间隔过短,则防抖可以使得对应的事件处理函数只执行最后触发的一次。

应用:搜索框搜索输入, 文本输入验证(手机号码,邮箱等),窗口大小resize(等窗口调整完成,再执行),滚动事件(等最后一次滚动再执行)等

function debounce(fn, delay, scope) {
    let timer = null;
    // 返回函数对debounce作用域形成闭包
    return function () {
        // setTimeout()中用到函数环境总是window,故需要当前环境的副本;
        let ctx= scope || this;
        // 如果事件被触发,清除timer并重新开始计时
        clearTimeout(timer);
        timer = setTimeout(function () {
            fn.apply(ctx, arguments);
        }, delay);
    }
}

函数节流

如果一个事件高频触发,但在n秒内只会执行时间内一次

应用: 滚动事件scroll,(只要页面滚动就会间隔一段时间判断一次),搜索keyup等

function throttle(fn,delay,scope) {
 let valid= true; // 设置一个标记
 return function() {
  let ctx= scope || this;
  // 在函数开头判断标记是否为true,不为true则return
  if(!valid) return;
  // 立即设置为false
  valid= false;
  // 在setTimeout执行完毕后再把标记设置为true表示可以执行下一次循环了,当定时器没有执行的时候标记为false
  setTimeout(() => {
   fn.apply(ctx,arguments)
   valid= true;
  },delay)
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值