# 面试高频手写题

手写题别急着背完整代码。先用一句话说清输入、输出和最容易踩的边界,再关掉答案自己写一遍;写完拿空值、重复调用和异步顺序试一试。面试时就算没写完,能把思路和取舍讲明白,也比默写一段记不住的实现更有帮助。

建议优先掌握:

  • instanceof - 考察对原型链的理解
  • new - 对创建对象实例过程的理解
  • call/apply/bind - 对this指向的理解
  • 手写promise - 对异步的理解
  • 手写原生ajax - 对ajax原理和http请求方式的理解,重点是get和post请求的实现

# 1 实现防抖函数(debounce)

⚡ 30 秒速记

  • 防抖 = 电梯关门:有人进来就重新等,停止触发 wait 毫秒后才执行最后一次
  • 核心三步:clearTimeout(timer) → timer = setTimeout(...) → 到点 fn.apply(this, args)
  • 返回普通函数(不是箭头函数)才能拿到调用时的 this;参数用 ...args 传最后一次的
  • 进阶:immediate 首次立即执行、cancel() 取消、flush() 立刻执行挂起的那次
  • 场景:搜索联想、输入校验、resize 结束后重算;React 里要用 useMemo / useRef 保持同一个防抖实例

防抖就是事件连续触发时一直重新计时,停下来超过 wait 才执行一次。 像电梯关门,只要还有人进来就重新等。实现就是闭包里存一个 timer,每次调用先 clearTimeout,再开新的 setTimeout,到点用 fn.apply(this, args) 执行,这样 this 和最后一次的参数都对。和节流的区别是:防抖只要最后一次,持续触发就一直不执行;节流是按固定间隔执行。React 里有个常见坑,每次渲染都 debounce(fn) 出一个新函数,计时器各自独立,等于没防。

时序图 · 4 个参与者 / 10 步
alt 返回前用户没再输入返回前又输入了新词用户用户防抖函数防抖函数定时器定时器联想接口联想接口输入 前1开一个 300ms 定时器2100ms 后输入 前端3清掉旧定时器 重新计时4又输入 前端面试5再次清掉 重新计时6用户停止输入超过 300ms到点触发7用最后一次的参数发请求8展示联想词9旧结果按序号丢弃 等新请求10

防抖函数原理:把触发非常频繁的事件合并成一次去执行 在指定时间内只执行一次回调函数,如果在指定的时间内又触发了该事件,则回调函数的执行时间会基于此刻重新开始计算

防抖动和节流本质是不一样的。防抖动是将多次执行变为最后一次执行,节流是将多次执行变成每隔一段时间执行

eg. 像百度搜索,就应该用防抖,当我连续不断输入时,不会发送请求;当我一段时间内不输入了,才会发送一次请求;如果小于这段时间继续输入的话,时间会重新计算,也不会发送请求。

webapp
公众号
开发者导航
切换夜间模式
点击侧边栏上一篇
点击侧边栏下一篇
折叠侧边栏
收起全部