闭包可实现javascript单例模式,通过iife封装私有实例变量并暴露getinstance方法确保唯一性。示例中singleton.getinstance()始终返回同一对象,支持延迟初始化与类结合写法,兼顾封装性与可读性。

闭包可以用来创建一个私有的、只被初始化一次的实例,从而实现 JavaScript 中的单例模式。
用闭包封装唯一实例
核心思路是把实例变量定义在闭包作用域内,对外只暴露一个获取实例的函数。这个函数每次调用都返回同一个对象,且构造逻辑仅执行一次。
- 利用立即执行函数(IIFE)创建封闭作用域,避免全局污染
- 内部声明一个私有变量(如 instance)存储实例
- 提供一个公有方法(如 getInstance),检查实例是否存在,不存在则新建
基础实现示例
以下是一个简洁可靠的单例封装:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const Singleton = (function() {
let instance = null;
function createInstance() {
return {
name: 'Singleton Instance',
getTime: () => new Date().toISOString()
};
}
return {
getInstance: function() {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();
// 使用方式
const a = Singleton.getInstance();
const b = Singleton.getInstance();
console.log(a === b); // true
支持传参与延迟初始化的增强版
如果单例需要接收配置或依赖,可以在 getInstance 中接受参数,但需注意:首次调用后的参数应被忽略,否则可能破坏单例一致性。
- 首次调用时保存参数并创建实例,后续调用直接返回已有实例
- 若需动态配置,应明确设计为“配置不可变”,或改用工厂+缓存策略
- 避免在 createInstance 中执行副作用过强的操作(如 DOM 操作、网络请求),除非你确定它只发生一次
与 ES6 类结合的写法
也可以将类和闭包结合,保持面向对象风格:
class Logger {
constructor() {
this.logCount = 0;
}
log(msg) {
console.log(`[${++this.logCount}] ${msg}`);
}
}
const LoggerSingleton = (function() {
let instance;
return {
getInstance: () => {
if (!instance) instance = new Logger();
return instance;
}
};
})();
这样既保留了类的可读性,又通过闭包保证了唯一性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










