闭包-防抖和节流

节流

  • 假如一个用户一直触发某个函数,并且每次触发时间小于5s,但是我们就每隔5s调用一次函数就是节流
  • 例如: 按电梯 验证码
  • 作用 :缓解服务器压力
//5s内不管点击多少次 真正的代码都只执行1次
let btn = document.querySelector('button')
//最开始的时间,页面同步代码执行完毕的时间
let preTime = new Date()
btn.addEventListener('click',function(){
    //事件处理函数只要被点击一定会执行
    let nowTime = new Date()
    if(nowTime - preTime > 5000){
       console.log('真正要执行的代码')
       preTime = nowTime
  }
})
//用闭包优化一个节流方法
let btn = document.querySelector("bontton")
let fn = function(){
   let preTime = new Date()
   return function b(){
       let nowTime = new Date()
       if( nowTime - preTime > 5000){
           console.log('真正要执行的代码')
           preTime = nowTime
    }
  }
}
let clickHandler = fn()
btn.addEventLister("click",clickHandler)
//继续优化
//匿名函数 (function(){})() 执行后的返回函数,作为click的事件处理函数
let btn = document.querySelector('button')
btn.addEventListener('click',(()=>{
   let preTime = new Date()
   return ()=>{
      let nowTime = new Date()
      if(nowTime - preTime > 5000){
           console.log('真正要执行的代码')
           preTime = nowTime
    }
  } 
})())

防抖

  • 在一段时间内触发一次事件函数,如果单位时间还没有到达,再次触发那个事件函数,那么就立刻停止上一次的事件直接重新计算间隔时间
  • 如果我做了个5秒的防抖,我3秒内点100次,从我最后一次点击开始,往后5秒后开始执行,也就是我点的越久拖的越久
let inp = document.querySelector('input')
inp.oninput = (function(timer){//没有传参,第一次时timer为undefined不会报错 第二次timer为定时器
    return function(){
      clearTimeout(timer)
      timer = setTimeout(()=>{
         console.log(inp.value)
    },1000)
  }
})()

节流

  • 在一段时间内触发一次事件函数,如果前一次触发的事件函数还没有执行,则再次触发的事件不做任何操作,在单位时间内触发多次,只会执行第一次触发的操作 
        let inp = document.querySelector('input')
        inp.oninput = (function (flag) {
            return function () {
                if (!flag) return  // 后续操作不再执行
                flag = false  //在3s的定时器未开启之前它一直是false,只要是false就一直return
                setTimeout(() => {   
                    console.log(inp.value)
                    flag = true
                }, 3000)
            }
        })(true)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值