JavaScript单例模式(Singleton pattern)示例代码运行逻辑疑问
你的核心认知误区是混淆了立即执行函数表达式(IIFE)的执行时机:你以为Singleton是那个定义instance的匿名函数,每次调用都会重新初始化instance,但实际上Singleton是这个匿名函数运行完成后返回的对象,instance = null的赋值逻辑只会在代码加载阶段执行一次,后续你调用的永远是Singleton上的getInstance方法,不会再触发instance的初始化逻辑。
完整运行逻辑拆解
代码初始化阶段(执行
Singleton赋值语句时)
包裹的匿名函数会立刻执行:- 初始化函数作用域内的变量
instance = null - 声明内部工具函数
createInstance - 返回一个包含
getInstance方法的普通对象,赋值给Singleton变量 - 由于
getInstance方法引用了外部匿名函数作用域内的instance变量,形成闭包特性,instance会一直保留在内存中,不会被销毁也不会被重新赋值为null。
- 初始化函数作用域内的变量
第一次调用
Singleton.getInstance()- 打印当前
instance的值为null - 判定
instance === null成立,调用createInstance生成实例对象,赋值给instance - 返回生成的实例给
instance1
- 打印当前
第二次调用
Singleton.getInstance()- 打印当前
instance的值为第一步生成的实例对象 - 判定
instance === null不成立,直接返回已经存在的instance给instance2
- 打印当前
执行
Object.is(instance1, instance2)instance1和instance2存储的是同一个对象的内存引用,因此返回结果为true。
这段代码实现单例的核心就是靠IIFE只执行一次+闭包保留私有变量的特性,保证全局只有一个实例被创建。
内容的提问来源于stack exchange,提问作者dhruv
相关产品推荐
相关产品推荐

