javascript中可通过闭包实现“只运行一次”的函数封装,核心是用闭包保存布尔标记(如hasrun)记录执行状态,首次调用执行逻辑并更新标记,后续调用直接返回缓存结果或跳过执行。

JavaScript 中可以通过闭包将函数执行逻辑封装成“只运行一次”的行为,核心思路是利用闭包保存一个内部状态(比如布尔标记),在函数体中判断该状态决定是否执行并更新它。
用闭包保存执行状态
闭包能维持外部函数作用域中的变量不被回收,正好用来记住函数是否已被调用过。通常在外层函数中定义一个私有变量(如 hasRun = false),返回的内层函数每次调用前检查这个变量。
- 如果未执行过,就运行目标逻辑,并把 hasRun 设为 true
- 如果已执行过,直接返回(或返回上次结果、undefined 等)
基础实现:返回带记忆的函数
下面是一个典型写法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function once(fn) {
let hasRun = false;
let result;
return function(...args) {
if (!hasRun) {
result = fn.apply(this, args);
hasRun = true;
return result;
}
return result; // 后续调用都返回首次结果
};
}
// 使用示例
const logOnce = once(() => console.log('只打印一次'));
logOnce(); // 输出:只打印一次
logOnce(); // 无输出
支持 this 和参数传递
上面的 once 已通过 apply 正确绑定 this 并透传所有参数,确保原函数上下文和入参不丢失。实际项目中常需兼容构造函数调用或箭头函数场景,但普通函数封装已足够应对多数一次性初始化逻辑(如事件监听器去重、模块加载防重复等)。
- 避免直接修改原函数,保持纯封装
- 返回新函数,不影响原始函数行为
- 结果缓存可选:若无需复用结果,也可只执行不返回
常见应用场景
这种模式在实际开发中很实用:
- 页面初始化脚本(如 DOM 加载后仅执行一次)
- 第三方 SDK 加载完成后的回调注册
- 防重复提交按钮点击处理
- 懒加载资源的首次触发逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










