网站首页 > 技术文章 正文
在前端开发的日常里,像监听窗口 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 实战技巧
你 发表评论:
欢迎- 05-10如何优化数据库和前端之间的交互?
- 05-10前端代码优化小秘籍(前端优化24条建议)
- 05-10VS Code当中的15个神仙插件,值得收藏
- 05-10如何自己开发一个Google浏览器插件?
- 05-10前端流行框架Vue3教程:14. 组件传递Props效验
- 05-10吃了一年的SU,最好用的插件都在这了
- 05-10前端必看!这款神器让网站界面告别千篇一律
- 05-10程序员请收好:10个非常有用的 Visual Studio Code 插件
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端md5加密 (49)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- 前端懒加载 (45)
- 前端接口 (46)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle查询数据库 (45)
- oracle约束 (46)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)