星海

工程化与性能 · 主观题 · 第 63 题

前端与全栈开发面试 · 第 63 题

请写出防抖(debounce)和节流(throttle)函数的实现思路,并说明各自的适用场景。

参考答案

防抖:

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

每次触发都清掉上一次的定时器,只有停止触发超过 wait 毫秒才执行。适合搜索联想、窗口 resize 结束后再计算、表单校验。

节流(时间戳版):

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

wait 毫秒内最多执行一次。适合滚动监听、拖拽、鼠标移动、按钮防连点。

要点:用 apply 保留 this 和参数;可以扩展 leading / trailing 选项(首次是否立即执行、最后一次是否补执行)以及 cancel 方法;在 React 中要用 useMemo 或 useRef 保持同一个防抖函数实例,否则每次渲染都会生成新函数,防抖失效。

解析

能写出代码并说清楚两者的区别和场景即可。

在线刷这套题:即时判分、错题本、闪卡复习,不用登录就能练。