节流防抖原理以及如何实现

防抖函数原理(debounce)

在事件被触发 n 秒后再执行回调,如果在这 n 秒内又被触发,则重新计时。
手写简化版:

const debounce = (fn, delay) => {
  let timer= null;
  return (...args) => {
    clearTimeout(timer);
    timer= setTimeout(()=> {
      fn.apply(this, args);
    },delay);
  };
};

适用场景:

  • 按钮提交场景:防止多次提交按钮,只执行最后提交的一次
  • 服务端验证场景:表单验证需要服务端配合,只执行一段连续的输入事件的最后一次,还有搜索联想词类似功能

节流函数原理(throttle)

规定在一个单位时间内,只能触发一次函数。如果这个单位事件内触发多次函数,只有一次生效。

const throttle = (fn, delay= 500) {
  let flag= true;
  return (...args) => {
    if(!flag) reurn;
    flag= false;
    setTimeout(()=> {
      fn.apply(this, args);
      flag= true;
    }, delay);
  };
};

适用场景

  • 拖曳场景:固定时间只执行一次,防止超高频次触发位置变动
  • 缩放场景:监控浏览器 resize
  • 动画场景:避免短时间内多次触发动画引起性能问题
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 最近和前端的小伙伴们,在讨论面试题的时候。谈到了函数防抖和函数节流的应用场景和原理。于是,想深入研究一下两者...
    youthcity阅读 23,648评论 5 78
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32
  • 问题的引出 在一些场景往往由于事件频繁被触发,因而频繁地进行DOM操作、资源加载,导致UI停顿甚至浏览器崩溃。在这...
    Mica_马超阅读 2,310评论 0 2
  • 今天周一,新的一周开始,早晨送下孩子我就去忙了,中午也是因为没有空接就把孩子托付给了孩子奶奶接,我回来去吃完...
    陈浩然妈妈阅读 477评论 0 0
  • 6点起床 工作到10点,死党打电话,死党那个开心的啊,生活充满阳光,生活充满希望啊,聊了一下尾周末要带的工具 10...
    书恒被从名了阅读 141评论 3 0