闭包在防抖和节流中起核心作用:它使内部函数能持续访问并修改外层变量(如timer或lasttime),实现跨调用状态保持;无闭包则无法清除前次任务,无法控制执行频率。

闭包在防抖和节流中起核心作用:它让内部函数能持续访问并修改外层函数定义的变量(如 timer 或 lastTime),从而实现跨多次调用的状态保持。没有闭包,每次触发都会新建局部变量,无法清除前一次任务,也就谈不上“控制频率”。
防抖靠闭包保存 timer 实现“重置延迟”
防抖的关键是“只执行最后一次”。这依赖闭包维持一个共享的 timer 变量:
- 外层函数
debounce(fn, delay)内声明let timer = null,该变量被返回的内层函数持续引用 - 每次事件触发时,内层函数先执行
clearTimeout(timer)—— 清除的是上一次闭包里存的那个定时器 - 再调用
setTimeout(...)并把新 ID 赋给同一个timer,完成“延后重计时” - 不同防抖实例(如搜索、缩放)各自调用
debounce(),会生成独立闭包,互不干扰
节流靠闭包保存 lastTime 或 timer 控制执行节奏
节流要保证“固定间隔最多执行一次”,闭包用来持久化判断依据:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
时间戳版:闭包保存
let lastTime = 0,每次触发对比Date.now() - lastTime >= delay,满足才执行并更新lastTime -
定时器版:闭包保存
let timer = null,仅当timer === null时才设新定时器,执行完回调立即置空,防止重复进入 - 两种写法都靠闭包避免变量污染全局,也确保状态在多次调用中连续有效
闭包同时解决 this 和参数传递问题
返回的闭包函数本身不绑定上下文,但可以显式处理:
- 用
fn.apply(this, arguments)或展开语法fn(...args)透传调用时的 this 和实参 - 若需支持取消(
cancel方法),也在闭包内暴露对timer的访问权限,比如挂载到返回函数上:debounced.cancel = () => clearTimeout(timer) - 避免直接写
setTimeout(fn, delay),否则this会丢失,fn拿不到正确上下文
不复杂但容易忽略
闭包不是刻意设计的技巧,而是 JavaScript 作用域机制的自然结果。只要内层函数引用了外层变量,且该函数在外部被保留(比如赋值给事件监听器),就构成了闭包。防抖节流正是典型应用:用它藏起 timer 或时间戳,既私有又持久,还天然隔离多个实例。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










