设计模式 - JavaScript 中的单例模式

Design pattern - Singleton pattern in JavaScript

我正在关注这个 article。我了解什么是单例模式,但我无法理解代码。

let Singleton = (function(){
    let instance = null;

    function createInstance() {
        let obj = new Object("I am the new instance");
        return obj;
    }

    return {
        getInstance:function() {
            console.log(instance);
            if(instance === null) {
                instance = createInstance();
            }
            return instance;
        }
    }
})();

function test() {
    let instance1 = Singleton.getInstance();
    let instance2 = Singleton.getInstance();
    console.log(Object.is(instance1,instance2));
}
test();

为什么instance1和instance2是一样的,我们每次调用Singleton时总是将实例初始化为null

we are always initializing the instance to null whenever we call Singleton.

你没有。 Singletonreturn语句中的对象,不包含let instance = null语句。该语句只执行一次;此变量在返回对象 (Singleton.getInstance) 的 getInstance 方法中的 closure 下捕获。代码相当于

let instance = null;

function createInstance() {
    let obj = new Object("I am the new instance");
    return obj;
}

let Singleton = {
    getInstance: function() {
        console.log(instance);
        if (instance === null) {
            instance = createInstance();
        }
        return instance;
    }
}

除了 instancecreateInstance 隐藏在 IIFE 的范围内。

您可以通过插入更多日志语句来验证 let instance = null 执行了多少次(以及何时)。