第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

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

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

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

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

六、本篇结语

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

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

相关推荐
ocean21032 小时前
2025-2026年AI部署与MLOps大厂面试高频问题
人工智能·面试·大模型推理·ai部署
辰烨chenye4 小时前
LeetCode Hot 100 题解 · 子串篇
算法·leetcode·职场和发展
洋不写bug8 小时前
链表面试笔试经典题目详细解析,题目多解法,复杂度分析
数据结构·链表·面试
黄敬峰9 小时前
一文搞懂结构化大模型输出:从 SSE 到 Tool Calling 的四种姿势
面试
星星落进兜里10 小时前
Redis 内存缓存,面试补充
数据库·redis·面试
蒸蒸yyyyzwd10 小时前
cpp 选手秋招学习笔记 day27
服务器·c++·面试·八股
程序员清风12 小时前
聊聊怎么缓解找工作的焦虑感?
java·后端·面试
杰克尼12 小时前
同城拼车项目面试问题_01
spring·面试·职场和发展
YonyouHRSaaS12 小时前
2026年AI招聘系统怎么选?AI面试功能怎么评估?
人工智能·面试·职场和发展·求职招聘·ai面试