sggmico / fe-happy-interview

面试不迷茫
Apache License 2.0
5 stars 0 forks source link

手写throttle(节流)、 debounce(防抖)函数 #5

Open sggmico opened 3 years ago

sggmico commented 3 years ago

一般在频繁触发不必要时,可以考虑采用 节流防抖思想进行优化,降低触发频次,提高页面性能。

节流

持续触发 转为 固定时间间隔(t)触发

具体应用场景,举例:

  1. 监听滚动 (onscroll)
  2. 监听窗口变量 (onresize)
  3. 日志收集

实现参考:

/**
 * 节流
 * @param {*} fn 
 * @param {*} delay 
 */
export const throttle = function (fn, delay) {
    let timer
    return function (...arg) {
        if (timer) return
        timer = setTimeout(() => {
            fn.call(this, ...arg)
            timer = null
        }, delay)
    }
}

防抖

持续触发 转为 自停止触发开始,固定时间(t)内无再次触发,则执行一次触发

具体应用场景 。举例:

  1. 输入框内 oninput事件

实现参考:

/**
 * 
 * @param {*} fn 
 * @param {*} delay 
 */
export const debounce = function (fn, delay) {
    let timer
    return function (...arg) {
        clearTimeout(timer)
        timer = setTimeout(() => {
            fn.call(this, ...arg)
        }, delay)
    }
}

其他写法,欢迎大家打码交流……