/**
 * 防抖函数 (Debounce Function)
 * 用于限制某个函数在短时间内频繁触发时只执行一次。
 * 这对于防止表单重复提交、搜索框输入触发等场景非常有用，
 * 因为它可以确保即使用户快速连续点击按钮或输入内容，
 * 相关操作也只会被执行一次，直到经过一段设定的时间间隔后才会允许再次触发。
 *
 * @param {Function} fn - 要防抖处理的目标函数
 * @param {number} t - 可选参数，指定等待的时间间隔（毫秒），默认为1000ms
 * @returns {Function} - 返回一个新的函数，该函数具有防抖行为
 */
export const Debounce = (fn, t) => {
  // 设置默认延迟时间为1000毫秒（1秒）
  const delay = t || 1000;

  // 定义一个变量来保存定时器ID，用于清除之前的定时器
  let timer;

  // 返回一个新函数，这个函数会替代原始函数被调用
  return function () {
    // 保存当前函数调用的所有参数和上下文
    const args = arguments;
    const context = this;

    // 如果之前有未完成的定时器，则清除它
    if (timer) {
      clearTimeout(timer);
    }

    // 检查是否是首次调用或上一次调用已经超过了设定的时间间隔
    const callNow = !timer;

    // 设置一个新的定时器，在指定的延迟时间后将timer置为空
    // 置空是为了下一次调用时能够正确判断是否立即执行目标函数
    timer = setTimeout(() => {
      timer = null;
    }, delay);

    // 如果是首次调用或者上一次调用已经超过了设定的时间间隔，则立即执行目标函数
    if (callNow) {
      fn.apply(context, args);
    }
  };
};
