在JavaScript中用IIFE实现单例模式

在JavaScript中用IIFE实现单例模式,javascript,Javascript,以前在我的公司工作的员工使用以下形式的Singleton模式来创建和获取JavaScript中的UI组件: getDetailForm: function() { this.getDetailForm = (function() { var form = // form creation logic return function() { return form; }; }()); return

以前在我的公司工作的员工使用以下形式的Singleton模式来创建和获取JavaScript中的UI组件:

getDetailForm: function() {
    this.getDetailForm = (function() {
        var form = // form creation logic

        return function() {
            return form;
        };
    }());

    return this.getDetailForm();
}
是否有任何理由在以下标准方式中使用该变化

getDetailForm: function() {
    var form;

    if (!form) {
        form = // form creation logic
    }

    return form;
}

第二个代码块不会记住变量形式的值:每次调用函数getDetailForm时,它表示一个新的闭包,并且在该范围内创建一个新的变量形式,每次都以未定义的形式开始

请参见以下如何在每次调用时打印init:

变量o={ getDetailForm:函数{ var形式; 如果!表格{ form='form';//表单创建逻辑 console.log'init'; } 申报表; } } console.logo.getDetailForm;
console.logo.getDetailForm;在你的第二个例子中,如果!类型{将始终为true。两个示例的作用不同。第一个示例只创建一次表单,第二个示例每次调用getDetailForm时都创建它。选择哪一个取决于您想要的内容。@FelixKling否,如果表单未初始化!表单将为true,但初始化时,它发生在if!表单中时将为false,除非if表单是一个类似于0的假可强制转换值,在这种情况下!0等于!false,然后将为true。请阅读闭包@Sycraw@Sycraw:每次调用getDetailForm时,都会创建一个新的空表单变量。因此!表单在每次调用函数时都为true。表单变量在函数调用之间不会保持不变。请注意,我处于启用状态我只是在谈论第二个例子。我理解并了解闭包,你是对的。我误解了上面的代码,对不起。你是对的。我实际上是想使用这个.form而不是var form,这样每次调用都会返回相同的表单。我喜欢它,因为它很简单。我以前的同事使用的模式更复杂,所以我想知道它是否比检查组件是否已经创建,如果还没有创建的模式有任何优势?我在回答中添加了一些注意事项。请注意,在这里提到的代码中,您向对象this.form添加了一个可见属性,这可能是您不想要的副作用:this.form的用户t对象可以像那样改变表单的值。