throttle - 节流

59 阅读1分钟

概念描述

  • 高阶函数,传入一个函数,返回一个函数。
  • 在持续时间 n 的操作下,每间隔时间 delay ,就执行一次回调, n > delay。n < delay 时,delay 时间后也会执行一次回调。
  • 回调函数执行需要绑定 this 和传参。

代码实现

/**
* @description: throttle
* 1、高阶函数,传入一个函数,返回一个函数。
* 2、在持续时间 n 的操作下,每间隔时间 delay ,就执行以下回调, n > delay。n < delay 时,delay 时间后也会执行以下回调。
* 3、回调函数执行需要绑定 this 和传参。
* @author: huen2015
*/

function throttle(fn: Function, delay: number = 300): EventListenerOrEventListenerObject | any {
    let timer: any = null

    return function (this: any, ...args: any[]) {
        if (timer) return

        timer = setTimeout(() => {
            fn.apply(this, args)
            clearTimeout(timer)
            timer = null
        }, delay)
    }
}

const throttleDom = document.querySelector('#throttle')
if (throttleDom) {
    // Event - UIEvent - MouseEvent - PointerEvent
    throttleDom.addEventListener('click', throttle(function (this: any, e: PointerEvent) {
        console.log('throttle - 节流')
        console.log('this', this)
        console.log('e', e)
    }))
}

应用场景

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

  • 滚动事件,滑到底部自动加载更多。

代码演示仓库