是否立即触发的防抖和节流函数

54 阅读1分钟
/**
 * 防抖函数
 * @param func 执行的函数
 * @param delay 延迟时间
 * @param immediate 是否立即触发
 * @returns 
 */
function debounce(func, delay, immediate) {
  let timeout;
  return function() {
    const context = this;
    const args = arguments;
    const later = () => {
      timeout = null;
      if (!immediate) {
        func.apply(context, args);
      }
    };
    const callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, delay);
    if (callNow) {
      func.apply(context, args);
    }
  };
}

/**
 * 节流函数
 * @param func 执行的函数
 * @param delay 延迟时间
 * @param immediate 是否立即触发
 * @returns 
 */
function throttle(func, delay, immediate) {
  let timer = null;
  let lastTime = 0;
  return function() {
    const context = this;
    const args = arguments;
    const now = Date.now();
    if (immediate && !lastTime) {
      func.apply(context, args);
      lastTime = now;
    } else {
      clearTimeout(timer);
      timer = setTimeout(() => {
        if (!immediate) {
          func.apply(context, args);
        }
        lastTime = Date.now();
      }, delay - (now - lastTime));
    }
  };
}