js函数防抖与函数节流

1.函数防抖(debounce)

  • 函数防抖,debounce。其概念其实是从机械开关和继电器的“去弹跳”(debounce)衍生出来的,基本思路就是把多个信号合并为一个信号。

  • 函数防抖就是让某个函数在上一次执行后, 满足等待某个时间内不再触发此函数后再执行, 而在这个等待时间内再次触发此函数, 等待时间会重新计算。

  • 处理诸如 resizescrollmousemovekeydown/keyup/keypress 等DOM事件的时候,通常我们不希望这些事件太过频繁地触发,比如input输入框架的格式验证,你可以隔200ms验证一次,而不是输入change之后立即验证。

/**
* 函数防抖
* @param {*} fn 需要防抖的函数
* @param {*} delay 延迟执行的时间
*/
function debounce(fn, delay) {
  let timeout;
  return function() {
    // 保存this和参数
    let context = this
    let args = arguments
    if(timeout) {
      clearTimeout(timeout) //频繁触发则清除上一次,只执行最后一次
    }
    timeout = setTimeout(() => {
      fn.apply(context, args)
    },delay)
  }
}
// 测试
function fn(num){
  console.log(num)
}
debounce(fn, 1000)(2) // 输出2

2.函数节流(throttle)

  • 函数节流有点类似函数防抖,区别就是:对于连续触发的事件,函数防抖只执行最后一次触发的事件,函数节流则是降低事件发生的频率,让事件以较低的频率执行。可参考http://demo.nimius.net/debounce_throttle/

  • 函数节流会用在比input, keyup更频繁触发的事件中,如resize, touchmove, mousemove, scroll。throttle 会强制函数以固定的速率执行。因此这个方法比较适合应用于动画相关的场景。

/**
* 函数节流
* @param {*} fn 要节流的函数
* @param {*} threshhold 执行间隔
*/
function throttle(fn, threshhold) {
  let timeout = null
  let start = new Date()
  return function() {
    // 保存this和参数
    let context = this
    let args = arguments
    clearTimeout(timeout)
    let curruent = new Date()
    if(curruent - start >= threshhold) {
      fn.apply(context, args)
      start = curruent
    } else {
      timeout = setTimeout(() => {
        fn.apply(context, args)
      }, threshhold)
    }    
  }
}

//测试,结果为每 5s 输出一个3,而不是 0.5s
let test = throttle((num) => {
  console.log(num)
}, 5000)
setInterval(() => {
  test(3)
}, 500)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 最近和前端的小伙伴们,在讨论面试题的时候。谈到了函数防抖和函数节流的应用场景和原理。于是,想深入研究一下两者...
    youthcity阅读 23,712评论 5 78
  • 在日常开发中,我们经常能够碰到以下工作场景: 对提交按钮进行变态的点击压力测试输入框内容的实时校验(譬如验证用户名...
    叫我小徐阅读 4,633评论 0 5
  • 概念 函数防抖(debounce) 当调用动作过n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执...
    yuanjiex阅读 3,772评论 0 1
  • 在进行窗口的resize、scroll,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负...
    iqing2012阅读 4,181评论 0 1
  • 1 概念 首先讲讲关注函数节流这个概念的原因~~,其实还是因为业务驱动,在实现无限加载组件(就是滚动到底部,就可以...
    Coder_不易阅读 7,202评论 1 3