防抖和节流的含义和应用场景

防抖(debounce)

debounce 函数它在被调用后会 等待一段时间(自己设置) 再执行。 如果在等待期间函数再次调用,之前 还未执行的调用 会被取消。重新计时在继续执行

简单来说:只要前一个函数没有执行完,那么在进行新的调用,后一个会取代前一个,并重新计师,由最后一次事件触发决定

function debounce(fn, delay) {
        var timer = null;
        return function () {
          var context = this,
            args = arguments;
          // 如果此时存在定时器的话,则取消之前的定时器重新记时
          if (timer) {
            clearTimeout(timer);
            timer = null;
          }
          // 设置定时器,使事件间隔指定事件后执行
          timer = setTimeout(() => {
            fn.apply(context, args);
          }, delay);
        };
      }

节流(throttle)

throttle 函数的目的很简单, 规定一个单位时间,在这个单位时间内, 只能有一次触发事件的回调函数执行 ,如果在同一个单位时间内某事件被触发多次,只有一次能生效。

简单来说:在一个段时间内只能只能做一件事,由第一次事件触发决定

function throttle2(fn, delay) {
  let last = null
  return function throttle_fn() {
    if(last === null) {
      last = setTimeout(() => {
        fn.apply(this, arguments)
        last = null // 清除已执行的计时器标记
      }, delay)
    }
  }
}

应用场景

防抖(debounce)

search搜索联想,用户在不断输入值时,用防抖来节约请求资源。

window触发resize的时候,不断的调整浏览器窗口大小会不断的触发这个事件,用防抖来让其只触发一次

节流(throttle)

鼠标不断点击触发,mousedown(单位时间内只触发一次)

监听滚动事件,比如是否滑到底部自动加载更多,用throttle来判断

发送手机验证码,点击第一次需要在一分钟以后才能在次点击才能再次发送


版权声明:本文为he1848852183原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。