// 防抖。当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时。
let deBounce = (fn, delay) => {
  let timer = null;
  return function (...args) {
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      fn(...args);
    }, delay);
  };
};

// 节流。当持续触发事件时,保证一定时间段内只调用一次事件处理函数。
let throttle = (fn, delay) => {
  let flag = true;
  return function (...args) {
    if (!flag) return;
    flag = false;
    setTimeout(() => {
      fn(...args);
      flag = true;
    }, delay);
  };
};

let deBounce2 = (fn, delay) => {
  let start = Date.now();
  return function (...args) {
    if (Date.now() - start > delay) {
      fn(...args);
    }
    start = Date.now();
  };
};

let throttle2 = (fn, delay) => {
  let start = Date.now();
  return function (...args) {
    if (Date.now() - start > delay) {
      fn(...args);
      start = Date.now();
    }
  };
};