防抖 和 节流

防抖 debounce

定义

所谓防抖就是触发事件之后,将多次触发合并成一次执行,即在规定时间内回调函数只执行一次,如果在时间内事件被触发,则该回调函数的执行时间从触发时重新计算。

适用场景
  • mousemove 鼠标滑动事件
  • input 输入事件
代码实现
function debounce(fn, delay){
  let timer
  return function(){
    if(!timer){ //如果定时器不存在,就定一个
      timer = setTimeout(()=>{
        fn.apply(this, arguments) //不绑定this,这里的箭头函数会指向window
      },delay)
    }else{
      //如果定时器存在,就清除掉,再定一个
      clearTimeout(timer) 
    }
  }
}
思路分析

触发事件-->存在定时器-->清除定时器-->下次触发重新定一个
触发事件-->不存在定时器-->定一个delay时间后执行的定时器-->执行回调函数

节流 throttle

定义

事件多次触发,只在一定时间内执行一次,只有在大于规定时间后才会再次触发。

适用场景
  • 商品搜索列表、商品橱窗等
  • 用户滑动时 定时 / 定滑动的高度 发送请求
代码实现

设置一个标识,表示是否处于规定时间内

function throttle(fn, delay){
  let flag = true
  return function(){
    if(flag){
      setTimeout(()=>{
        fn.apply(this, arguments)
        flag = true
      },delay)
    }
     flag = false
    
  }
}

根据时间判断

function throttle(fn, delay){
  let time = 0
  return function(){
    let now = new Date()
    if(now-time > delay){ //两次触发事件的时间差大于delay则执行函数
      fn.apply(this, arguments)
      time = now //将此次的时间记下,用于下次对比
    }
  }
}
思路分析

都是判断是否在规定时间内,在时间内就执行函数,然后改变状态。不在就跳过。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、问题 如何解决用户频繁操作所带来的性能问题? 二、场景 简书中的Markdown预览功能,希望用户停止输入0....
    Eric_lwh阅读 452评论 0 0
  • 需求:最近面试,面试官问说一下你项目中做了哪些优化?小哥哥:不由得想起了,防抖和节流。面试官:能不能手撕一下。老规...
    Nothinglefttosa阅读 371评论 0 0
  • https://hzu-zuoxiong.gitbooks.io/frontend_note/javascript...
    Time_Notes阅读 107评论 0 0
  • Ps: 比如搜索框,用户在输入的时候使用change事件去调用搜索,如果用户每一次输入都去搜索的话,那得消耗多大的...
    燕自浩阅读 6,041评论 0 1
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,810评论 16 22

友情链接更多精彩内容