防抖与节流看懂这两个动画就够了

1,336 阅读1分钟

看完还不懂来打我!

Part1防抖

用于将用户的操作行为触发转换为程序行为触发,防止用户操作的结果抖动。一段时间内,事件在我们规定的间隔 n 秒内多次执行,回调只会执行一次。

1特点

等待某种操作停止后,加以间隔进行操作

持续触发不执行

不触发的一段时间之后再执行

这样说可能不是很好理解。看下面例子,你就懂了。

理想情况下,只要在一定时间内一直有人进电梯,电梯就不可能关闭上去,但是如果超过一定时间没有人进电梯时候,电梯就上去了,这就是防抖(这里为了避免进入一个人电梯就上去一次,这是日常生活的写照,对于程序也应该如此)。

2场景

###1、鼠标滑动事件

2、表单搜索

3、发短信

3代码实现(简单版)

function debounce(fun,time){
  let timer
  return function(){
    clearTimeout(timer)
    let args = arguments
    timer=setTimeout(()=>{
      fun.apply(this,args)
    },time)
  }
}

Part2节流

上面的问题你应该已经发现了。 电梯(程序)不能一直不执行吧。所以电梯就做了一个限制,如果重量超过2千斤就关闭门了,不让人进入了,必须关门上楼了。

4场景

1、鼠标连续不断地触发某事件(如点击),只在单位时间内只触发一次;

2、懒加载时要监听计算滚动条的位置,但不必每次滑动都触发,可以降低计算的频率,而不必去浪费 CPU 资源;

5代码实现

function throttle(fun,time){
  let t1=0 //初始时间
  return function(){
    let t2=new Date() //当前时间
    if(t2-t1>time){
      fun.apply(this,arguments)
      t1=t2
    }
  }
}