闭包是实现函数多次触发拦截器最自然的方式——它不依赖外部状态变量,也不需要框架支持,仅靠函数自身“记住”执行历史,就能在每次调用时自动判断是否放行、跳过、合并或拒绝。

限制最大执行次数
适用于按钮防连点、接口限频、初始化逻辑只运行一次等场景。关键在于把计数器封在闭包内,外部无法篡改:
- 外层函数接收目标函数和最大允许次数,返回一个新函数
- 新函数内部维护私有计数器,每次调用前检查是否已达上限
- 超限时可选择静默忽略、返回默认值或抛出错误,不影响原函数逻辑
- 必须用 fn.apply(this, args) 正确透传上下文和全部参数,避免 this 丢失
只响应最后一次调用
适合搜索框输入、窗口缩放、表单提交等高频触发且只需处理最新意图的场景。核心不是取消旧请求,而是让旧结果“自我失效”:
- 闭包内维护一个递增的序号(如 let latestId = 0)
- 每次调用时生成新 id:const id = ++latestId
- 异步回调中比对当前 id 是否等于闭包保存的 latestId,仅相等才执行业务逻辑
- 这样即使多个 fetch 并发发出,也只有最后发起的那个能触发成功处理
组合多条件联合拦截
当拦截规则不止一条(比如要同时校验权限 + 脱敏 + 缓存时效),可把每个规则封装成独立闭包,再链式叠加:
- 每个闭包持有自己的配置:角色白名单、掩码长度、缓存时间戳等
- 通过 reduce 或手动嵌套方式,将前一个闭包的输出作为后一个的输入
- 例如:原始数据 → 权限过滤器 → 手机号掩码器 → 缓存检查器 → 最终返回
- 不同角色或环境可动态组装不同闭包序列,复用性高、耦合低
Before/After 执行拦截
在函数调用前后插入逻辑,形成 AOP 式增强,本质也是对“执行时机”的多次过滤:
- 闭包同时保存原函数、before 回调、after 回调,三者共享作用域
- 调用时自动执行 before → 原函数 → after,中间可修改参数、捕获异常、处理 Promise 返回值
- 支持同步与异步混合:若原函数返回 Promise,则 after 可在 then 中触发
- 多个拦截器可叠加使用,比如一个函数同时被权限闭包、日志闭包、性能统计闭包包裹
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











