JS高级-防抖节流

81 阅读2分钟

我正在参加「掘金·启航计划」

一、防抖和节流的区别

当事件密集触发时:

  • 防抖函数是不断地对触发事件做延迟,等到一定时间没有事件触发才执行函数
  • 节流函数是按照一定频率执行函数

二、防抖和节流的应用

防抖的应用场景:

  • 输入框频繁的输入内容,搜索或者提交信息;
  • 频繁的点击按钮,触发某个事件;

节流的应用场景:

  • 监听页面的滚动事件;
  • 鼠标移动事件

三、防抖和节流的实现

1. 通过一些第三方库实现

使用Underscore

  • 直接通过CDN引入:

<script src="https://cdn.jsdelivr.net/npm/underscore@1.13.1/underscore-umd-min.js"></script>

image-20220901211826004.png

2. 手写实现

防抖函数基本实现

没有立即执行、取消功能、函数返回值的功能哦

function debounce(fn, delay) {
  // 1.定义一个定时器, 保存上一次的定时器
  let timer = null

  // 2.真正执行的函数
  const _debounce = function() {
    // 取消上一次的定时器
    if (timer) clearTimeout(timer)
    // 延迟执行
    timer = setTimeout(() => {
      // 外部传入的真正要执行的函数
      fn()//独立函数调用,this指向window 又没有传参数,所以event是undefined
    }, delay)
  }

  return _debounce
}

节流函数基本实现

默认第一次触发执行,最后一次触发没有到时间不执行

function throttle(fn, interval, options) {
  // 1.记录上一次的开始时间
  let lastTime = 0

  // 2.事件触发时, 真正执行的函数
  const _throttle = function() {

    // 2.1.获取当前事件触发时的时间
    const nowTime = new Date().getTime()

    // 2.2.使用当前触发的时间和之前的时间间隔以及上一次开始的时间, 计算出还剩余多长事件需要去触发函数
    const remainTime = interval - (nowTime - lastTime)
    if (remainTime <= 0) {
      // 2.3.真正触发函数
      fn()
      // 2.4.保留上次触发的时间
      lastTime = nowTime
    }
  }

  return _throttle
}