/**
 * 封装定时器,解决多次调用定时器叠加问题及定时器无法清除的问题
 * @param {function} func - 需要执行的函数
 * @param {number} delay - 延迟时间,单位:毫秒
 * @param {boolean} immediate - 是否立即执行一次,默认为false
 * @returns {function} - 返回一个清除定时器的函数
 */
function debounce(func, delay, immediate = false) {
  let timer;
  return function() {
    let context = this;
    let args = arguments;
    if (timer) {
      clearTimeout(timer);
    }
    if (immediate) {
      let callNow = !timer;
      timer = setTimeout(() => {
        timer = null;
      }, delay);
      if (callNow) {
        func.apply(context, args);
      }
    } else {
      timer = setTimeout(() => {
        func.apply(context, args);
      }, delay);
    }
    return function() {
      clearTimeout(timer);
    };
  };
}