javascript闭包实现单例模式的核心是用闭包封装私有实例变量,通过返回函数控制唯一实例的创建与获取;定义iife内私有instance变量,首次调用创建并缓存,后续返回同一实例,确保全局唯一且不可外部修改。

JavaScript中利用闭包实现单例模式,核心是**用闭包封装私有实例变量,通过返回的函数控制唯一实例的创建与获取**。这种方式不依赖类或new关键字,天然避免重复初始化,且实例不会被外部直接修改。
闭包封装实例变量
把实例存在闭包的局部变量中,外部无法访问该变量,只能通过暴露的函数操作它:
- 定义一个立即执行函数(IIFE),内部声明一个私有变量(如instance)初始为null
- 返回一个函数,首次调用时创建实例并赋值给instance,之后每次都返回已创建的实例
- 这样既隐藏了实例,又保证了全局唯一性
基础实现示例
以一个日志工具为例:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
const Logger = (function() {
let instance = null;
function createLogger() {
return {
log: function(msg) {
console.log(`[LOG] ${msg}`);
}
};
}
return function() {
if (!instance) {
instance = createLogger();
}
return instance;
};
})();
// 使用
const logger1 = Logger();
const logger2 = Logger();
console.log(logger1 === logger2); // true
支持传参的增强版
如果构造逻辑需要参数(如配置项),可在首次调用时接收并缓存,后续调用忽略参数:
- 闭包内增加config变量记录首次传入的配置
- 判断instance是否存在,存在则直接返回;不存在才用当前参数初始化
- 注意:多次调用带不同参数时,只以第一次为准,避免状态混乱
注意事项
闭包单例虽简洁,但需留意几点:
- 无法在运行时重置实例(除非手动清空闭包内变量,一般不推荐)
- 不适合需要多配置共存的场景(比如多个数据库连接),此时应改用工厂或模块化方案
- 测试时若需重置状态,可暴露一个reset方法(仅开发环境启用)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










