第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

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

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

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

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

六、本篇结语

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

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

相关推荐
Android研究员11 小时前
Android进阶之事件分发机制深度剖析
android·前端·面试
触底反弹11 小时前
🔥 AI 写代码总翻车?这套实战方法论救了我
人工智能·面试·程序员
风栖柳白杨11 小时前
【面试】AI算法工程师_空白自测版本
人工智能·算法·面试
imbackneverdie12 小时前
知网官宣:禁止 AI 列为论文署名作者,标注 Gemini、DeepSeek 等 AI 为作者的稿件统一下架
大数据·人工智能·ai·职场和发展·aigc·科研·高校
测试老哥14 小时前
接口自动化测试分层设计与实践总结
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
风栖柳白杨15 小时前
【面试】职位要求_准备
面试·职场和发展
Assby15 小时前
为什么我不建议你在 MySQL 里写 `IN (超过1000个ID)`?从 AST 解析到存储引擎的深度拆解
后端·面试
过期动态16 小时前
【LeetCode 热题 100】找到字符串中所有字母异位词
java·数据结构·算法·leetcode·职场和发展·rabbitmq
触底反弹1 天前
🚀 从 DOM0 级到 React 合成事件:前端事件监听的 20 年演进史
前端·react.js·面试
kyriewen1 天前
我给前端项目的接口请求套了6层保护——才发现以前一直在裸奔
前端·javascript·面试