JavaScript:模块模式差异

JavaScript: module pattern differences

本文关键字:模式 模块 JavaScript      更新时间:2023-09-26

之间有什么区别

var module = (function(){
    return {} 
})()

(function(context){
    var module = {}
    context.module = module;
})(this)

this的属性不等价于变量。在全局范围内(即this引用window),它们是相似的。然而,例如,当你尝试delete他们时,他们会有不同的行为:

> this.module = {};
> delete this.module
true
> var module = {};
// cant be deleted

除此之外,这两个片段都创建了一个空对象,封装在一个闭包中,您可以在其中定义局部(私有)变量/函数等。在第二个函数中,该对象也被分配给局部变量module,但这也可以在第一个函数中完成。


@Eric:您使用new运算符的方法与第一个关于变量的方法类似。但是,它将创建该匿名函数的一个实例,而不是返回一个普通对象。它将继承来自自定义原型的属性,因此例如module.constructor将指向匿名函数(该函数不能被垃圾收集,但例如甚至可以重用以创建克隆)。我不建议使用这个。

最重要的是揭示模块模式。它允许您定义私有函数(尽可能多地使用javascript),并通过返回调用选择哪些函数是公共的。

var module = (function(){ 
    function foo() {}; // Public, since it's returned
    function bar() {}; // Private, since it is not returned
    return {
        foo: foo
    } 
})();

据我所知,最底层的一个只是将一个对象文字分配给另一个对象的命名空间。这可能是辛格尔顿模式的开始。

(function(context){
    var module = {};
    context.module = module;
}(this)

模块实际上可以用揭示模块模式来定义,这很难说,因为在您的示例中,它只是一个对象文字。