美文网首页
防抖与节流

防抖与节流

作者: 孟大仙 | 来源:发表于2021-03-23 18:50 被阅读0次

// 非立即执行版,及n秒内时间执行一次函数, 如果n秒又触发了事件,则会重新计算时间

function debounce (func, wait) {
  let timer

  return function (){
    let context = this
    let args = arguments
    if (timer) clearTimeout(timer)

    timer = setTimeout(() => {
      func.apply(context, args)
    }, wait)
  }
}

// 立即执行版,触发事件后函数立即执行,在n秒内不触发事件,才能继续执行函数的效果

function debounce2 (func, wait) {
  let timer

  return function (){
    let context = this
    let args = arguments
    if (timer) clearTimeout(timer)

    let flag = !timer
    timer = setTimeout(() => {
      timer = null
    }, wait)
    if (flag) func.apply(context, args)
  }
}

// 组合判断,根据业务场景情况选择使用

function debounce3 (func, wait, immediate) {
  let timer

  return function() {
    let context = this
    let args = arguments

    if (timer) clearTimeout(timer)

    // 如果需要立即执行
    if (immediate) {
      let flag = !timer
      timer = setTimeout(() => {
        timer = null
      }, wait)

      if (flag) func.apply(context, args)
    } else {
      timer = setTimeout(() => {
        func.apply(context, args)
      }, wait)
    }
  }
}

// 节流。 时间戳版

function throttle(func, wait) {
  let previous = 0

  return function() {
    let now = Date.now()
    let context = this
    let args = arguments

    // 立即执行一次,之后n秒再执行
    if (now - previous > wait) {
      func.apply(context, args)
      previous = now
    }
  }
}

// 定时器版。在持续触发事件的过程中,函数不会立即执行,并且每 1s 执行一次,在停止触发事件后,函数还会再执行一次

function throttle2(func, wait) {
  let timer

  return function() {
    let context = this
    let args = arguments

    if (!timer) {
      timer = setTimeout(() => {
        timer = null
        func.apply(func, wait)
      },wait)
    }
  }
}

相关文章

网友评论

      本文标题:防抖与节流

      本文链接:https://www.haomeiwen.com/subject/zdufhltx.html