第33篇:手写防抖&节流完整源码(进阶版)——立即执行、取消功能、面试满分终极版

前言

之前我们写过基础版防抖节流,能满足项目基础优化。

但 企业面试、高阶项目 不会止步于基础版:

面试官真正要你手写的是:支持立即执行、支持手动取消、兼容this、兼容事件参数、防抖收尾完整闭环 的进阶完整版。

很多新人只会写基础版,一遇到"立即执行、取消防抖"直接挂科。

本篇带你手撕 面试满分级别的防抖、节流终极源码,可直接用于生产环境、可写进简历项目亮点、面试直接默写通关。

一、进阶防抖(debounce)完整源码

需求分析(面试满分标准)

  • 支持 立即执行(首次触发立刻执行,后续延迟)

  • 支持 取消功能(手动终止等待、清空定时器)

  • 保留 this 指向、事件参数

  • 支持默认延迟时间

  • 支持收尾执行,逻辑闭环

终极完整源码(可直接生产使用)

复制代码

/** * 高阶防抖函数(面试满分版) * @param {Function} fn 回调函数 * @param {Number} delay 延迟时间 * @param {Boolean} immediate 是否立即执行 * @returns {Function} 防抖包装函数(带cancel取消方法) */ function debounce(fn, delay = 500, immediate = false) { let timer = null; // 生成包装函数 const debounceFn = function (...args) { // 保存this和参数,解决事件回调丢失问题 const context = this; // 每次触发清空旧定时器 if (timer) clearTimeout(timer); // 判断是否立即执行 if (immediate && !timer) { fn.apply(context, args); } // 延迟执行收尾 timer = setTimeout(() => { // 非立即执行模式,最后一次触发后执行 if (!immediate) { fn.apply(context, args); } timer = null; }, delay); } // 手动取消防抖 debounceFn.cancel = function () { clearTimeout(timer); timer = null; } return debounceFn; }

二、进阶防抖使用场景与实战演示

1. 搜索框防抖(普通延迟执行)

复制代码

const search = debounce((val) => { console.log("搜索关键词:", val); }, 500)

2. 按钮防重提交(立即执行+禁止重复触发)

复制代码

const submit = debounce(() => { console.log("提交表单"); }, 1000, true)

特点:第一次点击立即执行,1秒内重复点击无效,完美解决按钮频繁提交BUG。

3. 手动取消防抖

复制代码

// 终止本次等待的防抖任务 search.cancel();

三、进阶节流(throttle)时间戳+定时器双锁完整版

基础节流要么开头执行 ,要么结尾执行,会导致页面滚动收尾少一次触发。

企业标准高阶节流:时间戳 + 定时器 双重方案,首尾都会触发,体验丝滑无遗漏。

满分节流完整源码

复制代码

/** * 高阶节流函数(首尾双触发、无卡顿、无遗漏) * @param {Function} fn 回调 * @param {Number} interval 间隔时间 * @returns {Function} */ function throttle(fn, interval = 200) { let lastTime = 0; let timer = null; const throttleFn = function (...args) { const context = this; const now = Date.now(); // 时间戳方案:开头立即执行 if (now - lastTime >= interval) { lastTime = now; fn.apply(context, args); } else { // 定时器方案:收尾补一次执行 if (!timer) { timer = setTimeout(() => { lastTime = Date.now(); timer = null; fn.apply(context, args); }, interval); } } } // 节流取消 throttleFn.cancel = function () { clearTimeout(timer); timer = null; } return throttleFn; }

四、双锁节流核心优势

  • 滚动开始立刻触发,不卡顿

  • 滚动停止后自动补最后一次触发,数据不遗漏

  • 解决传统节流"停滚动不更新"的BUG

  • 自带取消方法,适配组件销毁、页面卸载

五、项目落地优化(简历亮点升级)

将本篇高阶防抖节流替换博客旧版工具函数:

优化点:支持按钮防重、滚动收尾更新、可手动取消任务、杜绝内存泄漏,项目稳定性直接对标生产级代码。

六、本篇结语

写到这里,你不再只会"调用防抖节流",而是能 独立手写工业级源码。

这道题是 初级前端必问、中级前端必考 的手撕题,能写出带立即执行、取消功能、双锁节流的完整版,已经吊打绝大部分零基础求职者。

相关推荐
卷福同学4 小时前
第一次当面试官有感
后端·面试
怕浪猫4 小时前
顶级模型一句话,AI 写出了能玩的 QQ飞车
前端·面试·github
呃呃呃呃ex4 小时前
9. TypeScript:从类型系统到工程实践
前端·面试
Blanche15004 小时前
Webpack 构建流程解析
javascript·面试
我叫黑大帅4 小时前
为了知道计算机为什么选择了二进制,我做了这些……
面试·程序员·计算机组成原理
怕浪猫4 小时前
DeepSeek Harness 系列图解
面试·前端框架·node.js
double_face4 小时前
AgentScope 2.0 源码解析系列(Java 版)|第 3 篇:State 模块,Agent 靠什么记住这轮对话
后端·面试
leavesleo4 小时前
KV Cache 压到 4bit 之后:SGLang 在 Blackwell 上的 1.78 倍上下文和 +78% 解码
面试
用户6802659051194 小时前
企业电脑统一管理怎么做?2026企业终端统一管理方法与工具推荐
javascript·后端·面试
RootSeeker4 小时前
Docker 里跑排障运行时,我先核对这几个点
后端·面试