JavaScript函数的节流与防抖

本文介绍了JavaScript中防抖(debounce)和节流(throttle)函数的实现原理,包括延迟执行版、立即执行版和组合版,并讨论了在不同场景下的选择。同时涵盖了时间戳版和定时器版的节流实现。
摘要由CSDN通过智能技术生成

JavaScript函数的节流与防抖


函数的 节流和防抖 可以有效的防止,函数频繁无意义的执行。至于选用节流还是防抖,得看具体的应用场景。

/*----------------------------------防抖函数---------------------------------*/
/**
* @description 防抖函数(debounce)(延迟执行版)--短时间内多次触发同一事件,只执行最后一次,中间的不执行
* @param func 要进行防抖的函数
* @param delay 延迟执行毫秒数
* @param context 上下文环境
* @return 返回防抖处理后的函数
*/
function debounce(func, delay, context) {
    let timer
    return function(...args) {          
      if (timer) clearTimeout(timer)
      timer = setTimeout(() => {
        func.apply(context, args)
      }, delay)
    }
}

/**
* @description 防抖函数(debounce)(立即执行版)--短时间内多次触发同一事件,只执行最开始的一次,中间的不执行
* @param func 要进行防抖的函数
* @param delay 延迟执行毫秒数
* @param context 上下文环境
* @return 返回防抖处理后的函数
*/
function debounce(func, delay, context) {
    let timer
    return function(...args) {          
      if (timer) clearTimeout(timer)
      let callNow = !timer
      timer = setTimeout(() => {
        timer = null
      }, delay)
      if (callNow) func.apply(context, args)
    }
}

/**
* @description 防抖函数(debounce)(组合版)--短时间内多次触发同一事件,只执行最后一次,
* 或者只执行最开始的一次,中间的不执行
* @param func 要进行防抖的函数
* @param delay 延迟执行毫秒数
* @param immediate 是否立即执行
* @param context 上下文环境
* @return 返回防抖处理后的函数
*/
function debounce(func, delay, immediate, context) {
    let timer
    return function(...args) {          
      if (timer) clearTimeout(timer)
      if (immediate) {
        let callNow = !timer
        timer = setTimeout(() => {
          timer = null
        }, delay)
        if (callNow) func.apply(context, args)
      } else {
        timer = setTimeout(() => {
          func.apply(context, args)
        }, delay)
      }
    }
}


/*----------------------------------节流函数---------------------------------*/
/**
* @description 节流函数(throttle) 时间戳版(立即执行的)--指连续触发事件但是在 n 秒中只执行一次函数。
* 即 2n 秒内执行 2 次... 。节流如字面意思,会稀释函数的执行频率
* @param func 要进行节流的函数
* @param delay 延迟执行毫秒数
* @param context 上下文环境
* @return 返回节流处理后的函数
*/
function throttle(func, delay, context) {
  let previous = 0
  return function(...args) {
    let now = Date.now()
    if (now - previous > delay) {
      func.apply(context, args)
      previous = now
    }
  }
}

/**
* @description 节流函数(throttle) 定时器版(延迟后执行的)--指连续触发事件但是在 n 秒中只执行一次函数。
* 即 2n 秒内执行 2 次... 。节流如字面意思,会稀释函数的执行频率
* @param func 要进行节流的函数
* @param delay 延迟执行毫秒数
* @param context 上下文环境
* @return 返回节流处理后的函数
*/
function throttle(func, delay, context) {
  let timeout
  return function(...args) {
    if (!timeout) {
      timeout = setTimeout(() => {
        timeout = null
        func.apply(context, args)
      }, delay)
    }
  }
}

/**
* @description 节流函数(throttle)(组合版)--指连续触发事件但是在 n 秒中只执行一次函数。
* 即 2n 秒内执行 2 次... 。节流如字面意思,会稀释函数的执行频率
* @param func 要进行节流的函数
* @param delay 延迟执行毫秒数
* @param type 1 时间戳版(立即执行的)  2 定时器版(延迟后执行的)
* @param context 上下文环境
* @return 返回节流处理后的函数
*/
function throttle(func, delay, type, context) {
  let previous = 0
  let timeout
  
  return function(...args) {
    if (type === 1) {
        let now = Date.now()
        if (now - previous > delay) {
          func.apply(context, args)
          previous = now
        }
    } else if (type === 2) {
      if (!timeout) {
        timeout = setTimeout(() => {
          timeout = null
          func.apply(context, args)
        }, delay)
      }
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值