函数节流是控制高频事件执行频率的技术,通过时间戳或定时器实现“定节奏”执行:时间戳版首次触发即执行,定时器版支持尾部执行,完整版可配置首尾执行逻辑,并需提供cancel方法防止内存泄漏。

函数节流就是给高频事件“定个节奏”,让它别疯跑——比如滚动、拖拽、缩放窗口时,原本每毫秒都可能触发几十次的回调,节流后能强制它每 16ms(≈60fps)最多执行一次,既保持响应感,又不压垮浏览器。
节流的核心逻辑:时间戳控制
最常用也最直观的方式,是靠时间差判断是否允许执行:
- 记录上一次执行的时间戳(previous)
- 每次触发时,拿当前时间(Date.now())减去 previous
- 如果差值 ≥ 设定间隔(如 100ms),就执行函数,并更新 previous;否则跳过
这种方式首次调用即执行(“立即执行”),适合需要快速反馈的场景,比如实时显示滚动位置。
定时器版节流:延迟执行 + 冷却期
用 setTimeout 搭配标志位,实现“等一等再执行”的效果:
- 设一个 timer 变量,初始为 null
- 触发时若 timer 为空,就启动定时器;若已有 timer,则不处理
- 定时器到时执行函数,并清空 timer,开放下一次触发入口
这种写法天然支持“尾部执行”,适合对时机要求不敏感但需稳定频率的操作,比如批量更新 UI 状态。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
带首尾控制的完整实现
实际项目中常需灵活选择:第一次要不要立刻执行?最后一次漏掉的要不要补?可通过选项控制:
- leading: true → 首次触发立即执行
- trailing: true → 结束前若还有未执行的,延迟执行一次
- 两者都开,就兼顾响应与完整性;只开 leading,适合滚动监听;只开 trailing,适合 resize 后收尾布局
同时别忘了加 cancel 方法,手动清除 pending 定时器,避免内存泄漏或页面卸载后误执行。
怎么用在高频事件上?以滚动为例
直接绑定节流后的函数即可,不用改原有逻辑:
- window.addEventListener('scroll', throttle(handleScroll, 16, { leading: true, trailing: false }))
- 16ms 对应 60fps,视觉最流畅;数值太小起不到节流作用,太大则响应迟钝
- 注意 this 和参数传递——用 func.apply(this, arguments) 或箭头函数捕获上下文
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










