resize事件需防抖,因其在窗口拖拽时高频触发,易导致卡顿;通过settimeout清除重设定时器实现,延迟100–250ms执行,兼顾响应与性能,并需注意监听器与定时器的正确清理。

处理 window 的 resize 事件时,直接绑定回调会导致高频触发(尤其拖拽窗口时),影响性能。防抖(debounce)是常用解法:只在用户停止调整窗口尺寸一段时间后执行一次回调。
为什么 resize 需要防抖
浏览器在窗口大小变化过程中会连续触发 resize 事件,频率可能高达每秒数十次。若回调中涉及 DOM 操作、计算布局或发起请求,极易造成卡顿或重复渲染。防抖能确保逻辑只在“稳定”后运行一次,兼顾响应性与性能。
用 setTimeout 实现简易防抖
核心思路是每次触发时清除前一个定时器,重设新延时任务:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
let resizeTimer;
window.addEventListener('resize', () => {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(() => {
console.log('窗口尺寸已稳定,执行逻辑');
// ✅ 这里放你的实际处理代码,如更新布局、重绘 canvas 等
}, 200); // 延迟 200ms,可根据需要调整
});
封装可复用的防抖函数
避免重复写定时器逻辑,推荐封装成通用函数:
function debounce(fn, delay) {
let timer;
return function (...args) {
clearTimeout(timer);
timer = setTimeout(() => fn.apply(this, args), delay);
};
}
const handleResize = debounce(() => {
console.log('宽:', window.innerWidth, '高:', window.innerHeight);
// 例如:适配响应式图表、重设 grid 列数等
}, 150);
window.addEventListener('resize', handleResize);
- 支持传参和
this绑定,适用多数场景 - 延迟时间建议 100–250ms:太短仍可能频繁触发,太长影响感知响应
- 注意内存泄漏风险:页面卸载前应移除监听器(见下一点)
清理监听器与定时器(进阶要点)
单页应用中,若组件销毁但未清理 resize 监听,可能导致内存泄漏或错误执行:
- 使用
removeEventListener时,必须传入与添加时**完全相同的函数引用**,所以不能直接传匿名函数或每次新建的防抖函数 - 推荐将防抖函数声明为模块级变量,或使用闭包保存引用
- 在组件卸载(如 React
useEffect清理函数、VuebeforeUnmount)中调用removeEventListener
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










