『JavaScript从零开始』防抖与节流

1,971 阅读3分钟

大家好,我是程序员_随心,希望能够通过自己的学习输出给你带来帮助。

前言

当我们进行输入框内容校验以及进行窗口的resize、scroll时,如果事件处理函数调用的频率不控制的话,那么会对浏览器造成很大负担,很有可能造成卡顿,用户体验非常差。此时我们可以采用防抖节流来减少频次,同时又不影响实际效果。

1.什么是防抖和节流?

防抖: 当持续触发事件时,一段时间内没有再触发事件,事件处理函数才会再执行一次。

详细点讲: 当持续触发事件时,一段时间内没有再触发事件,事件处理函数才会再执行一次。如果设定的时间到来之前,又一次触发了事件,那就重新延时。如下图:当持续触发click事件时,并不执行handle函数,延迟1000毫秒后才执行handle函数。

debounce

节流: 当持续触发事件时,保证一定时间内只触发一次处理函数。

详细点讲: 节流就比如我们的水龙头,阀门一打开,水哗哗地流,秉承着勤俭节约的传统美德,我们要把水龙头关小一点,让它慢一点流。当我们滚动加载数据时,我们想控制事件在1000ms内执行一次,如下图:

debounce

2.防抖和节流的应用场景是什么?

防抖的应用场景:

  • 按钮的点击
  • 输入框输入
  • 鼠标的移入移出

节流的应用场景:

用于减少调用频率。

主要用于高频的事件中,比如mouseover,scroll,resize等。

3.防抖和节流的怎么实现?

函数防抖

function debounce(fn, delay) {
  let timer = null;
  return function () {
    timer && clearTimeout(timer);
    timer = setTimeout(fn, delay);
  }
}

如何使用呢?

当滚动事件时:

 function handle() {
   console.log(Math.random());
 }

const btn = document.querySelector('#btn');
btn.addEventListener('click', debounce(handle, 1000));

详细案例请见码上掘金

函数节流

函数节流主要有两种实现方式:时间戳和定时器。接下来分别用这两种方法实现:

函数防抖主要有两种实现方式:时间戳和定时器。接下来分别用这两种方法实现:

(1) 使用时间戳实现

function throttle(fn, delay) {
  let start = Date.now();
  return function () {
    let now = Date.now();
    if (now - start >= delay) {
      fn();
      start = Date.now();
    }
  }
}

(2) 使用定时器实现

function throttle(fn, delay) {
  let timer = null;
  return function () {
    if (!timer) {
      timer = setTimeout(() => {
        fn();
        timer = null;
      }, delay);
    }
  }
}

如何使用呢?

当滚动事件时:

function handle() {
  console.log('滚动事件执行');
}

window.addEventListener('scroll', throttle(handle, 1000));

详细案例请见码上掘金

最后

您的每一个点赞及评论都是对我坚持写作最大的支持! 另外希望各位朋友和我交流讨论,如有不对的地方,更希望批评指正!

我是程序员随心,希望能够通过自己的学习输出给你带来帮助。