机制:从搜索框到手写 debounce 的完整实现)
防抖Debouncing机制从搜索框到手写 debounce 的完整实现【免费下载链接】30-seconds-of-interviewsA curated collection of common interview questions to help you prepare for your next interview.项目地址: https://gitcode.com/gh_mirrors/30/30-seconds-of-interviews多数人把防抖Debouncing理解成延迟执行这是误解。延迟只是表象真正的动作发生在每次新事件到来时——上一轮还没兑现的执行被直接作废直到事件停满约定的冷却期函数才真正跑一次。30-seconds-of-interviews 面试题库里有一道经典的防抖题questions/debouncing.md 把这种手法定义为把多次连续调用合并成单次调用group multiple sequential calls in a single one下面从零开始把它吃透。跑通一个最小防抖先看效果。给搜索框直接挂监听用户每敲一个字符就发一次网络请求套一层 300ms 的防抖只有停止输入 300ms 之后才会发出那唯一一次请求function debounce(fn, delay) { let timer; return function(...args) { clearTimeout(timer); // 每次触发都重置计时 timer setTimeout(() { fn.apply(this, args); // 停满 delay 才真正执行 }, delay); }; } const box document.getElementById(q); box.addEventListener(input, debounce(e { console.log(发请求:, e.target.value); }, 300));敲abc三个字母中间的所有请求都被丢弃控制台只在停顿后打印一行。三行代码三个考点防抖的全部秘密就藏在这三行里逐条拆开let timer声明在闭包里。它是跨调用共享的状态每次进入返回函数时都能拿到上一轮的计时器句柄。若把它声明进函数体内每次调用都生成新句柄重置就无从谈起事件一停就立刻执行防抖名存实亡。clearTimeout(timer)永远先于setTimeout。只要事件还在高频到来计时器不断被掐断重建永远熬不到到期。漏掉这一行行为就退化成一普通过期回调每次触发各执行一次。fn.apply(this, args)透传调用现场。外层刻意用普通函数捕获调用时的this与参数再通过apply交还给原函数。若直接用箭头函数包一层this会被外层作用域锁死事件对象、事件目标、传参都会错位。仓库中的标准实现questions/debouncing.md也是同样的骨架只是把参数写成了argumentsconst debounce (func, delay) { let debounceTimer; return function() { const context this; const args arguments; clearTimeout(debounceTimer); debounceTimer setTimeout( () func.apply(context, args), delay ); }; };面试时先讲清楚重置而非延迟再顺一遍这个闭包结构基本就拿到这题的满分路径了。变体面试官的三板斧追问leading edge 立即执行版。trailing默认适合搜索框这类持续输入leading 则是首次触发立刻执行、冷却期内忽略后续、delay结束才恢复适合防连点这类不希望重复执行的场景function debounce(fn, delay) { let timer; return function(...args) { if (!timer) fn.apply(this, args); // 不在冷却期立即执行 clearTimeout(timer); timer setTimeout(() (timer null), delay); }; }挂一个 cancel 取消挂起执行。组件卸载时清理还没到期的回调避免操作已销毁的 DOMdebounced.cancel () clearTimeout(timer);防抖和节流的分界。throttle 在固定时间窗内保证至多执行一次事件密集时也能持续均匀地跑适配滚动加载、拖拽这类必须保持响应的场景debounce 负责以最终状态为准的收敛执行。合并到最后一次用防抖限速用节流这句区分要背下来。在 30-seconds-of-interviews 里这道题如何流转题目以 Markdown 落在 questions/debouncing.md含标准答案、加分项和补充链接三块固定结构scripts/extract.js 用getSection分别解析#### Answer、#### Good to hear、##### Additional links再从 HTML 注释里抽出 tags 与难度产出物是 data/questions.json每题一条记录带 tags、expertise 与代码块字段站点脚本见 website/index.js基于该 JSON 渲染题目列表支持按标签过滤与排序防抖题就藏在这个可检索的题库里。带走清单防抖每次触发都重置计时器事件停满delay才执行一次闭包变量记下上一次计时器clearTimeout才能精准重置apply把this和参数透传给原函数调用语义不变以最终状态为准用防抖必须匀速执行用节流。【免费下载链接】30-seconds-of-interviewsA curated collection of common interview questions to help you prepare for your next interview.项目地址: https://gitcode.com/gh_mirrors/30/30-seconds-of-interviews创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考