# 面试高频手写题
手写题别急着背完整代码。先用一句话说清输入、输出和最容易踩的边界,再关掉答案自己写一遍;写完拿空值、重复调用和异步顺序试一试。面试时就算没写完,能把思路和取舍讲明白,也比默写一段记不住的实现更有帮助。
建议优先掌握:
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) 出一个新函数,计时器各自独立,等于没防。
防抖函数原理:把触发非常频繁的事件合并成一次去执行 在指定时间内只执行一次回调函数,如果在指定的时间内又触发了该事件,则回调函数的执行时间会基于此刻重新开始计算

防抖动和节流本质是不一样的。防抖动是将多次执行变为最后一次执行,节流是将多次执行变成每隔一段时间执行
eg. 像百度搜索,就应该用防抖,当我连续不断输入时,不会发送请求;当我一段时间内不输入了,才会发送一次请求;如果小于这段时间继续输入的话,时间会重新计算,也不会发送请求。