JavaScript之防抖节流

函数防抖(debounce):就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重头开始计算函数执行需要的时间。

函数节流(throttle):就是指连续触发事件,但是在 n 秒中只执行一次函数,时间间隔小于n秒触发事件都是无效的。

共通点:两者一般适合用在频繁对某事件进行操作的场景。

函数防抖

典型应用

  • 百度搜索框在输入稍有停顿时才更新推荐热词。
  • 频繁操作点赞和取消点赞,需要获取最后一次操作结果并发送给服务器

原理实现

//函数防抖
function debounce(handle, delay) {
  var delay = delay || 300;
  var timer = null;
  return function () {
    var _this = this;
    var _args = arguments;
    clearTimeout(timer);
    timer = setTimeout(function (){
      handle.apply(_this, _args);
    }, delay);
  }
}

函数节流

一个函数只有在大于执行周期时才执行,周期内调用不执行。好像水滴积攒到一定程度才会触发一次下落一样。

典型应用:

  • 抢券时疯狂点击,既要限制次数,又要保证先点先发出请求
  • 轮播图左右方向点击
  • 窗口调整(window.onresize)
  • 页面滚动(window.onscroll)

原理实现

// 函数节流
function throttle(handle, wait) {
  var wait = wait || 300;
  var lastTime = 0;
  return function () {
    var _this = this;
    var _args = arguments;
    var nowTime = new Date().getTime();
    if ((nowTime - lastTime) > wait) {
        handle.apply(_this, _args);
        lastTime = nowTime;
      }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 最近和前端的小伙伴们,在讨论面试题的时候。谈到了函数防抖和函数节流的应用场景和原理。于是,想深入研究一下两者...
    youthcity阅读 23,717评论 5 78
  • 在前端开发的过程中,我们经常会需要绑定一些持续触发的事件,如 resize、scroll、mousemove 等等...
    淘淘笙悦阅读 226,934评论 42 349
  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 8,867评论 1 11
  • 第十章 落寞英雄 烟灭在沙中,而Jerry的内心依旧在燃烧。Gordon哥点了两杯橙汁,和Jerry面对面坐了下...
    九韦的猪阅读 2,828评论 4 3
  • 人们的膳食模式与生活方式密切相关。 高血压、高胆固醇、体重超标、缺乏体力活动、水果和蔬菜摄入量不足、吸烟,都是引起...
    海鸥_2686阅读 1,748评论 0 1