# JavaScript Debounce

防抖 通俗的来说就是多次合并为一次 debounce(防抖),简单来说就是防止抖动。

当持续触发事件时,debounce会合并事件且不会去触发事件,当一定时间内没有触发再这个事件时,才真正去触发事件

非立即执行版的意思是触发事件后函数不会立即执行,而是在n秒后执行,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。

//思路 先清除再定义
const debounce = (func, wait, ...args) => {
  let timeout;
  return function(){
    if (timeout) clearTimeout(timeout);
    timeout = setTimeout(() => {
      func.apply(context, args)
    }, wait);
  }
}

立即执行版的意思是触发事件后函数会立即执行,然后n秒内不触发事件才能继续执行函数的效果。

const debounce = (func, wait, ...args) => {
  let timeout;
  return function(){
    const context = this;
    if (timeout) cleatTimeout(timeout);
    let callNow = !timeout;
    timeout = setTimeout(() => {
      timeout = null;
    }, wait)
    
    if(callNow) func.apply(context,args)
   }
}

实际运用

1.对于按钮防点击来说的实现:一旦我开始一个定时器,只要我定时器还在,不管你怎么点击都不会执行回调函数。一旦定时器结束并设置为 null,就可以再次点击了。

2.就是用于input输入框架的格式验证 3.提交按钮的点击事件 4.实时搜索 6.给按钮加函数防抖防止表单多次提交 7.对于输入框连续输入进行AJAX验证时,用函数防抖能有效减少请求次数 8.判断scroll是否滑到底部,滚动事件+函数防抖

总的来说,适合大量事件按时间做平均分配触发。

其他

  • 按一个按钮发送 AJAX:给 click 加了 debounce 后就算用户不停地点这个按钮,也只会最终发送一次;如果是 throttle 就会间隔发送几次
  • 监听滚动事件判断是否到页面底部自动加载更多:给 scroll 加了 debounce 后,只有用户停止滚动后,才会判断是否到了页面底部;如果是 throttle 的话,只要页面滚动就会间隔一段时间判断一次
陕ICP备20004732号-3