防抖和节流

Debounce

  • 每次触发函数,都将原来的定时器清空
  • 一直触发函数,那定时器就一直在被清空,
  • 直到下一次触发函数间隔超过了延迟时间, 回调函数才会被执行
    这是防抖的原理
function debounce(fun, delay, immediate){
  var timeout = null, 
      result = null
  return function(){
    var _this = this
    var args = arguments
    // 在 setTimeOut 中, this 指向 window,
    // func 原有的 this 以及 arguments 会丢失
    // 所以在这里保存下来,使用 apply(call),将这个保存下来的参数传递进去
    timeout ? clearTimeout(timeout) : ''
    // 希望事件触发之后,先立即执行一次,
    // 下一次执行才延迟
    if(immediate){
      // 如果在一次事件触发过程中,定时器的回调函数被执行过
      // timeout 就是有值的,而不是 null
      // 所以 !null == true 的时候,就是回调函数函数可以运行的时候(canRun)
      var canRun = !timeout
      timeout = setTimeout(function(){
        timeout = null
      }, delay)
      canRun ? result = fun.apply(_this, args) : ''
    }else{
      timeout = setTimeout(function(){
        fun.call(_this, args)
      }, delay)
    }
    return result
  }
}

这几行代码重点解释一下:

timeout = setTimeout(function(){
  timeout = null
}, delay)

希望每次都是在间隔结束后立即触发函数,而不是等延迟结束再触发。这么说可能有点绕,设想: 延迟时间为10s,第一次触发需要debounce的事件,然后停止事件的触发操作;等待10s,回调函数执行。
第二次触发,在等待10s,回调函数执行。这就是else代码块里面的逻辑。

然后上面的代码是: 如果timeoutnull,就让其立即执行,但是执行之后,要将timeout置为null,否则下次就会得到canRun的值为false,不会触发回调函数。

Throttle

节流就是对于频繁触发的事件,在一段时间内只触发一次。

function throttle(fun, delay){
  var prev = 0
  return function(){
    var now = +new Date()
    var _this = this
    var args = arguments
    if(now - prev > delay){
      fun.apply(_this, args)
      prev = now
    }
  }
}
function throttle(fun, delay){
  var timeout = null
  return function(){
    var _this = this
    var args = arguments
    if(!timeout){
      timeout = setTimeout(function(){
        timeout = null
        fun.apply(_this, args)
      }, delay)
    }
  }
}

区别

防抖:当你患有癫痫的手一顿操作使其事件一直触发,某个时候停了,并且停顿的时间超过延迟时间之后,执行一次函数。
节流:当你患有癫痫的手一直触发某个操作,但是能让函数在一段时间内只触发一次。

全部评论

相关推荐

个人背景:学院二本计科专业 大二开始实习个人经历:安克创新 、理想汽车、字节跳动碎碎念:我做事只有三分钟热度。看到进了大厂的同学,我会羡慕,也会跟着努力上进;但遇到好看的小说,我又会放下手头的事沉迷其中,之前的坚持也就中断了。我有些自卑,总觉得自己学历和外貌都不够好。之前偶然在网上受到关注,我就喜欢上了上网,因为这里有很多人认可我。但我也很在意别人的评价,偶尔看到嘲讽的言论,会触发我的自卑情绪,让我感到愤怒。有时候我会强硬地回怼,有时候又会懦弱地选择无视。我也有虚荣心。不管是拿到安克、理想还是字节的机会,我在分享的时候都会带着这份心思。我会特意强调自己学历不好,是为了衬托出过程的艰难,以此显得自己更厉害。我知道,人往往会炫耀自己缺少的东西,来掩盖内心的空洞。我总想着走捷径,不太喜欢踏踏实实地做事。找实习的时候,我花了更多时间在研究面试技巧上,而不是提升专业能力。我会反复听面试录音分析技巧,看面试教程学习怎么和不同的面试官沟通,还会每天自言自语练习语言表达,同学都觉得我有点奇怪。我的实习生涯里,侥幸和运气占了很大一部分。我总在想,如果有一天我失去了这份幸运,这些特质可能会让我一蹶不振。ps: 很多人会问我学习路线和经验 但是就像我上面说的 我的实习过程靠的很多是关键节点的运气 技术上面我可能不如很多人  所以请大家理性求助和理性参考我的回答 附上我的投递记录
我的offer在哪里...:从去年看到现在,飞升哥就是榜样
我的求职进度条
点赞 评论 收藏
分享
牛客29046817...:优化一下简历,突出重点,简历上的技能复习扎实,实习工作啥的整理成文档梳理一下怎么说要有自己的思考在里边,岗位的话运维,测试,开发,实施,技术支持能投的都投,多投递能找到的,秋招投递了3个月左右(8月中旬到11月下旬),boos打招呼8000多次,官网投递300多家,才找到一家满意的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务