闭包可封装私有计数器实现函数调用次数限制,支持自定义阈值、超限响应及正确传递this和参数。

用闭包可以轻松记录并限制函数的调用次数,核心是把计数器私有化,不被外部直接修改。
封装计数器和调用逻辑
定义一个外层函数,内部声明计数变量和目标函数,返回一个新函数。每次调用返回的函数时,先判断是否超过阈值,再执行原逻辑或拒绝调用。
- 计数器变量定义在外层函数作用域内,无法从外部访问或重置
- 返回的函数通过闭包“记住”这个变量,实现状态保持
- 可在判断逻辑中统一处理超限情况,比如抛错、返回默认值或静默忽略
支持自定义限制次数和提示行为
让闭包工厂函数接收最大调用次数和可选的超限响应(如错误消息、回调函数),提升复用性。
- 例如:
limitCall(fn, 3, { onError: () => console.warn('已达上限') }) - 超限时不一定抛异常,可根据场景选择警告、返回 null 或触发清理动作
- 保留原始函数的 this 绑定和参数透传,避免影响调用方式
注意 this 和参数的正确传递
返回的包装函数需用 apply 或展开运算符转发 this 和所有参数,否则原函数内部的上下文会丢失。
- 错误写法:
limitedFn() { fn() }—— 丢失 this 和参数 - 正确写法:
limitedFn(...args) { return fn.apply(this, args) } - 箭头函数不可用于包装器,因为它不绑定自己的 this
实际使用示例
比如限制某个 API 请求函数最多调用 2 次:
const apiCall = limitCall(fetchData, 2, { onError: () => alert('请求已禁用') });apiCall(); // 正常执行
apiCall(); // 正常执行
apiCall(); // 触发 onError 提示











