两者都是高频事件的性能优化手段。防抖(debounce):事件触发后延迟执行,若在等待期内再次触发则重新计时,只有「停下来」才真正执行——适合搜索输入联想、窗口 resize 后的重算。节流(throttle):固定时间间隔内只执行一次,保证均匀触发——适合滚动监听、按钮防连点(但防连点更常用防抖的立即执行版)。

function debounce(fn, wait) {
  let timer = null;
  return function (...args) {
    clearTimeout(timer);
    timer = setTimeout(() => fn.apply(this, args), wait);
  };
}

function throttle(fn, interval) {
  let last = 0;
  return function (...args) {
    const now = Date.now();
    if (now - last >= interval) {
      last = now;
      fn.apply(this, args);
    }
  };
}

易错点:实现时要保留 this 和参数(用 apply);防抖分「延迟执行」与「立即执行(leading)」两种变体;定时器版本节流与时间戳版本的行为差异(最后一次是否补执行)。追问:requestAnimationFrame 作为另一种节流思路。