简单的聊聊节流和防抖

作者: 小鳄鱼的大哥哦 | 来源:发表于2019-01-30 14:55 被阅读3次

防抖函数(debounce)和节流函数(throttle)为了防止函数被连续调用而被发明出来。
说说他们的异同之处,这里以我的话(我觉得)来解释一下。

他们的区别动画

防抖函数(debounce)

函数在某个时间段内被连续触发,在最后一次触发后再执行

场景:一个搜索框,需要触发input事件,来实时的请求服务端的数据。某个用户想搜索NIKE买一波鞋子,如果不做处理的话,那么浏览器会发起四次请求N,NI,NIK,NIKE。这在某种情况下(需要限制的情况)就造成了资源浪费。理想状态下,等用户输入完成NIKE之后,再去向服务端发起请求。为了防止这样的连续请求,防抖函数(debounce)就很必要了。在用户停止输入后的1s后再去请求数据就比较合适了。

针对以上场景简述一下原理:
有点绕如果input事件一直触发,那么Ajax就一直不触发,直到input事件1s内不触发,Ajax才触发。

function debounce(fun, delay) {
  var timer;
  return function() {
    // 如果一直触发input事件,就一直清除之前的定时器
    clearTimeout(timer);
    // 清除之后再定义一个新的定时器,准备执行的方法
    timer = setTimeout(() = >{
      // 把this指向对应的input方便操作,然后传参
      fun.apply(this, arguments)
    },
    delay)
  }
}

document.querySelector('input').oninput = debounce(function(event) {
  // Ajax(event.target.value)
},1000)
节流函数(throttle)

函数在某个时间段内被连续触发,只执行一次

场景:一个搜索按钮,某个用户为了好玩在2S内点击了100次,如果不做处理的话,会连续多次向服务器发起请求,服务器不堪重负了。那么如果我们在这里使用节流函数,让点击的事件1s内只触发1次

针对以上场景简述一下原理:
当click事件执行一次之后,需要等到第2s才能执行下一次,在这期间的click事件无效

function throttle(fun, threshhold = 1000) {
  var timer, start = Date.now();
  return function() {
    var now = Date.now();
    // 如果一直触发click事件,就一直清除之前的定时器
    clearTimeout(timer);
    // 当前时间 - 之前执行时的时间  执行间隔时间是够超过规定的时间
    if (now - start >= threshhold) {
      fun.apply(this, arguments);
      start = now;
    } else {
      timer = setTimeout(() = >{
        fun.apply(this, arguments);
      },threshhold)
    }
  }
}

document.querySelector('button').onclick = throttle(function(event) {
  // Ajax()
},2000)

如果对这两种函数的区别还有困惑的话,再仔细琢磨一下好了
他们的区别动画

防抖函数(debounce)和节流函数(throttle)的都简单实现了,lodash对这这两种函数有更加复杂的实现
lodash的debounce实现
lodash的throttle实现

相关文章

  • 简单的聊聊节流和防抖

    防抖函数(debounce)和节流函数(throttle)为了防止函数被连续调用而被发明出来。说说他们的异同之处,...

  • 谈谈js中的节流和防抖函数

    关于节流和防抖,这篇文章说的很好了,深入lodash源码分析防抖和节流深入篇 | Lodash 防抖和节流是怎么实...

  • 2019-06-24 函数节流和函数防抖

    最近看了很多blog里介绍的函数节流和函数防抖,所以整理出一套较为简单,易理解的函数节流和函数防抖 函数节流:首先...

  • JavaScript防抖和节流

    1. 认识防抖和节流 1.1. 对防抖和节流的认识 防抖和节流的概念其实最早并不是出现在软件工程中,防抖是出现在电...

  • 2019-03-27

    js的防抖和节流 据我所知防抖和节流都是为了优化作用,减轻浏览器和服务端的负担,防抖和节流俩个的英文要记住: de...

  • Javascript 基础

    1、函数防抖和函数节流 【《javascript高级程序设计》里,函数节流是这里讲的函数防抖。】函数防抖: 在事件...

  • 前端性能优化-浅谈js防抖和节流

    浅谈js防抖和节流

  • 简单理解"防抖和节流"

    防抖(debounce): 概念: 在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。 个人理解:...

  • js的防抖和节流

    js的 防抖(debounce)和 节流(throttle ) 防抖和节流一般用于高频触发事件,属于浏览器性能优化...

  • js 防抖 节流

    节流 防抖1 防抖2

网友评论

    本文标题:简单的聊聊节流和防抖

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