面试官:手写一个防抖和节流?

在浏览器的 滚动、搜索、窗口大小变化 等高频事件里,如果你还在 无差别触发函数,页面会卡顿、接口会爆炸、服务器会报警。
防抖(Debounce)和节流(Throttle)就是两把“节奏锁”——

  • 防抖:等事件 完全停稳 后再执行一次;
  • 节流:让事件在 固定间隔内 只执行一次。

掌握这两个函数,就能让 滚动加载更丝滑、搜索框更聪明、按钮更防误触。接下来,我们用 20 行代码 + 3 个场景,把它们彻底学会。

一、防抖(Debounce)

作用:事件触发后 n 秒 内不再触发,才执行函数。

版本 1:原生 setTimeout

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

版本 2:带立即执行选项

function debounce(fn, delay, immediate = false) {
  let timer = null;
  return function (...args) {
    if (immediate && !timer) fn.apply(this, args);
    clearTimeout(timer);
    timer = setTimeout(() => {
      timer = null;
      if (!immediate) fn.apply(this, args);
    }, delay);
  };
}

二、节流(Throttle)

作用n 秒内 最多执行一次。

版本 1:时间戳

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

版本 2:定时器

function throttle(fn, delay) {
  let timer = null;
  return function (...args) {
    if (!timer) {
      timer = setTimeout(() => {
        timer = null;
        fn.apply(this, args);
      }, delay);
    }
  };
}

三、速查表

场景选择
搜索框输入debounce(fn, 300)
滚动加载throttle(fn, 200)
窗口 resizedebounce(fn, 200, true)

四、面试一句话

“防抖用于搜索框输入,节流用于滚动加载,核心都是 控制触发频率。”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赛博切图仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值