JS 防抖和节流

107 阅读1分钟

防抖和节流目的是为了减少事件触发的频次,假设允许事件执行的间隔为 t;

防抖:事件多次触发,如果 t 时间内没有再次触发,事件执行;

节流:事件触发执行后,t 事件内不会再次执行;

防抖的实现

let debounce = function(fn, delay = 500) {
  if (typeof fn !== "function") {
    throw new TypeError("Expected a function");
  }
  let timer = null;
  return (...arg) => {
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(function() {
      fn.call(arg);
    }, delay);
  };
};

节流的实现

let throttle = function(fn, delay = 400) {
  if (typeof fn !== "function") {
    throw new TypeError("Expected a function");
  }
  let flag = true;
  return function(...args) {
    if (!flag) return;
    flag = false;
    setTimeout(() => {
      fn(...args);
      flag = true;
    }, delay);
  };
};