防抖和节流

149 阅读1分钟

防抖和节流都是防止一段时间内某一函数被频繁触发,避免大量计算导致的页面卡顿。

不同的是,防抖是将多次执行变为最后一次执行,节流是多次执行变为规定时间内只执行一次。

防抖

在事件被触发n秒后再执行回调函数,如果这n秒内又被触发,则重新计时

应用

  • 输入搜索联想,用户在不断输入值时
  • 按钮点击:收藏,点赞,心标等
  • window触发resize的时候,不断的调整浏览器窗口大小会不断的触发这个事件,用防抖让其只触发一次

代码

//非立即执行版
function debounce(fun, delay) {
  return function (args) {
    let that = this;
    let args_ = args;
    clearTimeout(fun.timer);
    fun.timer = setTimeout(function () {
      fun.apply(that, args_);
    }, delay);
  };
}

节流

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

应用

  • 鼠标不断点击触发,点击事件在规定时间内只触发一次
  • 监听滚动事件,用节流来判断,是否滑动到底部自动加载更多

代码

//时间戳+定时器版
//第一次触发能响应,结束触发也能有响应
//第一次触发能响应,结束触发也能有响应
function throttle(fun, delay) {
  let timer = null;
  let previous = 0;
  return function (args) {
    let now = Date.now();
    let remaining = delay - (now - previous);
    let that = this;
    let args_ = args;
    if (remaining <= 0) {
      fun.apply(that, args_);
      previous = Date.now();
    } else {
      timer = setTimeout(function () {
        fun.apply(that, args_);
      }, remaining);
    }
  };
}