Javascript增强模块:为什么在将模块作为参数传递时将IIFE分配给模块?

时间:2016-05-25 12:20:52

标签: javascript design-patterns

我对增强模块模式不熟悉,而且我已经看过很多这样的例子了:

var MODULE = (function (my) {

    my.method = function () {
        // added method...
    };

    return my;
}(MODULE));

我想知道为什么我需要首先将这个IIFE分配给MODULE,当我将MODULE作为参数传递给IIFE时。

例如,这给出了相同的结果:

(function (my) {

    my.method = function () {
        // added method...
    };

    return my;
}(MODULE));

(已提供MODULE)。

所以我的问题是:要么好吗?如果是这样,为什么我看到的所有例子都使用第一个?在我看来,MODULE已被分配'方法'两次。 是否只是在第一个例子中声明MODULE是这样的情况,以防它不存在?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您经常看到这个文字示例,那么您可能会看到不好的例子。

如果您不打算返回其他对象,则无需将结果分配回变量。

但通常情况下,例如:

var MODULE = (function (my) {

    my.method = function () {
        // added method...
    };

    return my;
}(MODULE || {}));
//      ^^^^^^---------- note

...这使得将其分配回MODULE变量必不可少,以防万一没有创建对象。如果尚未创建任何对象,则MODULE将为undefined,因此MODULE || {}将评估为新创建的对象。

  

在我看来,MODULE被赋予了两次“方法”。

除非代码运行两次。

  

是不是第一个例子中MODULE被声明的情况,如果它还不存在?

是。如果你有几个不同的文件来定义MODULE的不同部分,那么它们运行的​​顺序并不重要(前提是它们没有尝试使用那些没有的部分已定义)。

这个主题有很多变化。例如:

变化1:

var MODULE = MODULE || {};
(function(my) {
    // ...
})(MODULE);

变化2:

var MODULE;
(function(my) {
    // ...
})(MODULE = MODULE || {});

在答案的顶部写下这些变体的优点是你不必记得在函数结束时返回my。 (当然,如果你忘了,它会很早就爆炸,你会很快发现并修复这个错误,所以这是非常小的优势。)