模拟实现underscore中的防抖(debounce)

杨济
• 阅读 1298

防抖(debounce):当持续触发事件时,不希望频繁执行操作,而是希望过段时间再执行。
例如:滚动窗口,刚开始滚动时触发一次(第三个参数设置为true),并且打印当前时间和'hello debounce'(第一个参数函数执行的结果),若持续滚动则不触发,若再次触发时间与上次触发间隔了1500ms(第二个参数间隔时间)时则再次触发
应用:点击按钮发送请求时,不希望用户频繁点击触发请求

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div style="height: 3000px"></div>
</body>
<script src="./debounce.js"></script>
<!-- <script src="https://cdn.jsdelivr.net/npm/underscore@1.10.2/underscore.min.js"></script> -->
<script>
  // 防抖函数
  var debounce = _.debounce(function () {
    console.log((new Date()))
    console.log('hello debounce')
  }, 1500, true)
  window.onscroll = debounce
  // 第三个参数为true 立即调用  滑动时立即执行
  // 第三个参数为false 默认 等待1500时间后执行 两次触发间隔大于1500才执行
  // 核心在于上一次调用防抖函数与这一次调用之间是否大于间隔1500 只有大于时才会执行
</script>
</html>

实现:

// debounce.js
var _ = {}
_.now = Date.now

/* 
  @method: debounce防抖函数,避免频繁触发操作
  @params: 1. Function 需要防抖的函数
           2. Number   防止抖动的间隔时间
           3. Boolean  是否立即调用
  @return: 返回传入函数参数的防抖版本
*/
_.debounce = function (func, wait, immediate) {
  var lastTime, timeOut, args, result
  // 防抖
  var later = function () {
    var last = _.now() - lastTime
    if (last < wait) {
      timeOut = setTimeout(later, wait - last)
    } else {
      timeOut = null
      if (!immediate) {
        result = func.apply(null, args)
      }
    }
  }
  return function () {
    args = arguments
    lastTime = _.now()
    var callNow = immediate && !timeOut
    if (!timeOut) {
      timeOut = setTimeout(later, wait)
    }
    if (callNow) {
      result = func.apply(null, args)
    } 
    return result
  }
}
点赞
收藏
评论区
推荐文章
海军 海军
4年前
浅聊函数防抖与节流
防抖(debounce)所谓防抖,就是指触发事件后n秒后才执行函数,如果在n秒内又触发了事件,则会重新计算函数执行时间。防抖类型分为1.非立即执行版2.立即执行版3.合成版本防抖防抖应用场景登录、发短信等按钮避免用户点击太快,以致于发送了多次请求调整浏览器窗口大小时,resize次数过于频繁,造成计算过多,此时需要一次到
记录 30 seconds of code 项目个人觉得中有价值的片段或者小技巧(二)
DF系列1、防抖函数,限制高频触发jsconstdebounce(fn,ms0)lettimeoutId;returnfunction(...args)clearTimeout(timeoutId);timeoutIdsetTimeout(()fn.apply(this,args),ms);
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Souleigh ✨ Souleigh ✨
2年前
overscroll-behavior特殊场景的应用
overscrollbehavior特殊场景的应用前言简单介绍一下overscrollbehavior的一些应用场景。例如Mac左右滚动误触返回,部分区域滚动到底部触发连锁反应等等。overscrollbehavioroverscrollbehaviorC
Chase620 Chase620
4年前
防抖和节流
防抖触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次触发,则重新计算事件思路每次触发的时候取消之前的延时调用方法,以当下为准//防抖functiondebounce(fn){lettimeoutnull;returnfunction(){clearTimeout
LinMeng LinMeng
4年前
js的防抖与节流
在进行窗口的resize、scroll,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕。此时我们可以采用debounce(防抖)和throttle(节流)的方式来减少调用频率,同时又不影响实际效果。函数防抖函数防抖(debounce):当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才
Stella981 Stella981
3年前
Hystrix异常处理及线程池划分
异常处理异常传播在HystrixCommand实现的run()方法中抛出异常时,除了HystrixBadRequestException之外,其他异常均会被Hystrix认为命令执行失败并触发服务降级的处理逻辑,所以当需要在命令执行中抛出不触发服务降级的异常时来选择它。在使用注解配置实现Hystrix命令时,可以忽略指定的异常
Stella981 Stella981
3年前
JavaScript——页面相关事件
页面事件是在页面加载或改变浏览器的大小、位置,以及对页面中的滚动条进行操作时,所触发的事件处理程序。加载与卸载事件加载事件(onload)是在网页加载完毕后触发相应的事件处理程序,它可以在网页加载完成后对网页中的表格样式、字体、背景颜色等进行设置。卸载事件(unload)是在卸载网页时触发相应的事件处理程序,卸载网页是指关闭当前页或
Stella981 Stella981
3年前
JavaScript 事件不触发
在class上绑定的事件,点击图片的时候无法触发<divid"files"class"files"<div<p<canvaswidth"80"height"80"</canvas<br<spanclass
菜园前端 菜园前端
2年前
什么是防抖和节流?
原文链接::::tip防抖和节流一般在做用户体验优化的时候会用上。:::什么是防抖?是指一个事件在同一时间内被多次频繁触发后,最终只会执行一次。多次触发后会重新计算时间,只生效最后一次触发。基础案例可通过定时器来实现javascriptvartimer0f
小白学大数据 小白学大数据
3个月前
Python 实现如何电商网站滚动翻页爬取
一、电商网站滚动翻页机制分析电商网站如亚马逊和淘宝为了提升用户体验,通常采用滚动翻页加载数据的方式。当用户滚动页面到底部时,会触发新的数据加载,而不是一次性将所有数据展示在页面上。这种机制虽然对用户友好,但对爬虫来说却增加了爬取难度。以淘宝为例,其商品列表