You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript单例模式(Singleton pattern)示例代码运行逻辑疑问

你的核心认知误区是混淆了立即执行函数表达式(IIFE)的执行时机:你以为Singleton是那个定义instance的匿名函数,每次调用都会重新初始化instance,但实际上Singleton是这个匿名函数运行完成后返回的对象,instance = null的赋值逻辑只会在代码加载阶段执行一次,后续你调用的永远是Singleton上的getInstance方法,不会再触发instance的初始化逻辑。

完整运行逻辑拆解

  1. 代码初始化阶段(执行Singleton赋值语句时)
    包裹的匿名函数会立刻执行:

    • 初始化函数作用域内的变量instance = null
    • 声明内部工具函数createInstance
    • 返回一个包含getInstance方法的普通对象,赋值给Singleton变量
    • 由于getInstance方法引用了外部匿名函数作用域内的instance变量,形成闭包特性,instance会一直保留在内存中,不会被销毁也不会被重新赋值为null。
  2. 第一次调用Singleton.getInstance()

    • 打印当前instance的值为null
    • 判定instance === null成立,调用createInstance生成实例对象,赋值给instance
    • 返回生成的实例给instance1
  3. 第二次调用Singleton.getInstance()

    • 打印当前instance的值为第一步生成的实例对象
    • 判定instance === null不成立,直接返回已经存在的instance给instance2
  4. 执行Object.is(instance1, instance2)
    instance1和instance2存储的是同一个对象的内存引用,因此返回结果为true。

这段代码实现单例的核心就是靠IIFE只执行一次+闭包保留私有变量的特性,保证全局只有一个实例被创建。


内容的提问来源于stack exchange,提问作者dhruv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:39:01