网站首页 > 技术文章 正文
在前端开发的日常里,像监听窗口 resize、输入框实时搜索、按钮高频点击这类场景,简直不要太常见。可一旦处理不好,频繁触发的事件分分钟让页面卡顿、浏览器假死,甚至把服务器请求搞到崩溃,用户体验直接 “原地爆炸”!别急,JS 里的防抖和节流技术就是解决这些难题的 “秘密武器”,今天就带大家解锁 3 种超实用方案。
技术原理剖析
防抖(Debounce):就像等电梯关门,你一直按关门按钮,电梯不会立刻关门,而是等你一段时间不按了,才执行关门动作。在代码里,防抖就是当事件被频繁触发时,设定一个延迟时间,只有在延迟时间内事件不再触发,才执行对应函数。
节流(Throttle):好比过独木桥,一次只允许一个人通过,规定好间隔时间。在代码中,节流是指在一定时间间隔内,无论事件触发多少次,都只执行一次函数,以此控制函数执行频率。
代码示例详解
方案一:普通防抖函数
// 创建一个防抖函数,接收要执行的函数和延迟时间
function debounce(func, delay) {
let timer;
return function() {
// 每次触发事件时,清除之前的定时器
if (timer) {
clearTimeout(timer);
}
// 设置新的定时器,延迟delay毫秒后执行func函数
timer = setTimeout(() => {
func.apply(this, arguments);
}, delay);
};
}
// 使用示例:监听窗口resize事件
window.addEventListener('resize', debounce(() => {
console.log('窗口大小改变,执行相关操作');
}, 300));
方案二:普通节流函数
// 创建一个节流函数,接收要执行的函数和时间间隔
function throttle(func, limit) {
let inThrottle;
return function() {
// 如果当前处于节流状态(inThrottle为true),则直接返回,不执行函数
if (inThrottle) return;
// 执行函数
func.apply(this, arguments);
// 设置为节流状态
inThrottle = true;
// 延迟limit毫秒后,将inThrottle设置为false,允许下次函数执行
setTimeout(() => {
inThrottle = false;
}, limit);
};
}
// 使用示例:监听滚动事件
window.addEventListener('scroll', throttle(() => {
console.log('页面滚动,执行相关操作');
}, 200));
方案三:lodash 库的防抖节流
// 引入lodash库
const _ = require('lodash');
// 使用lodash的防抖函数,延迟300毫秒
const debouncedFunc = _.debounce(() => {
console.log('lodash防抖函数执行');
}, 300);
// 使用lodash的节流函数,间隔200毫秒
const throttledFunc = _.throttle(() => {
console.log('lodash节流函数执行');
}, 200);
对比效果实测
在模拟高频触发场景下,未处理的事件触发 100 次时,页面卡顿明显;使用普通防抖函数,在延迟 300ms 后,事件触发次数减少到 1 - 2 次;普通节流函数将事件触发频率限制在每 200ms 一次;lodash 库的防抖节流不仅代码简洁,性能表现也十分稳定,在复杂项目中优势更明显。
扩展思考
防抖和节流在实际项目中的应用远不止这些,比如在移动端的 touchmove 事件处理、游戏开发的动画渲染频率控制中都大有用处。而且在 React、Vue 等框架里,使用防抖节流又有哪些最佳实践?当项目对性能要求极高时,是选择手写还是使用第三方库更合适?
是手写防抖节流更能掌控细节,还是直接用 lodash 这类库更香?大伙在项目里都咋用的?快来评论区分享你的实战经验,咱们好好唠唠!
猜你喜欢
- 2025-05-08 佳能RF系统中有哪些宝藏镜头?(佳能rf镜头2021最新消息)
- 2025-05-08 前端分享-VueUse着实是有东西的(vue.use做了什么)
- 2025-05-08 前端必看!10 个 Vue3 实战技巧,解决 90% 开发难题?
- 2025-05-08 高并发下实现幂等的几种方式(并发和幂等)
- 2025-05-08 解释一下什么是防抖(Debounce)和节流(Throttle)? (面试题)
- 2025-05-08 前端人必收!10 个 Vue3 隐藏技巧,解决 99% 开发卡顿?
- 2025-05-08 CP+2016:五挡防抖 富士100-400现场试用
- 2025-05-08 「SpringCloud」(三十九)使用分布式锁实现微服务重复请求控制
- 2025-05-08 前端人必看!10 个 Vue3 救命技巧,专治性能差、代码乱
- 2025-05-08 前端必看!9 个让你效率翻倍的 JavaScript 实战技巧
你 发表评论:
欢迎- 06-24发现一款开源宝藏级工作流低代码快速开发平台
- 06-24程序员危险了,这是一个 无代码平台+AI+code做项目的案例
- 06-24一款全新的工作流,低代码快速开发平台
- 06-24如何用好AI,改造自己的设计工作流?
- 06-24濮阳网站开发(濮阳网站建设)
- 06-24AI 如何重塑前端开发,我们该如何适应
- 06-24应届生靠这个Java简历模板拿下了5个offer
- 06-24服务端性能测试实战3-性能测试脚本开发
- 566℃Oracle分析函数之Lag和Lead()使用
- 566℃几个Oracle空值处理函数 oracle处理null值的函数
- 550℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 545℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 543℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 536℃【数据统计分析】详解Oracle分组函数之CUBE
- 526℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 519℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)