Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript增强模块:为什么在将模块作为参数传入时将IIFE分配给模块?_Javascript_Design Patterns - Fatal编程技术网

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

Javascript增强模块:为什么在将模块作为参数传入时将IIFE分配给模块?,javascript,design-patterns,Javascript,Design Patterns,我对增强模块模式不熟悉,并且我经常看到这个示例: var MODULE = (function (my) { my.method = function () { // added method... }; return my; }(MODULE)); 我想知道,当我将模块作为参数传递给IIFE时,为什么首先需要将这个IIFE分配给模块 例如,这会给出相同的结果: (function (my) { my.method = function (

我对增强模块模式不熟悉,并且我经常看到这个示例:

var MODULE = (function (my) {

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

    return my;
}(MODULE));
我想知道,当我将模块作为参数传递给IIFE时,为什么首先需要将这个IIFE分配给模块

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

(function (my) {

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

    return my;
}(MODULE));
(提供的模块已声明)

所以我的问题是:两者都可以吗?如果是这样,为什么我看到的所有示例都使用第一个?在我看来,模块被分配了两次“方法”。 在第一个示例中,模块是这样声明的,以防它不存在吗


谢谢

如果你经常看到这个字面上的例子,那么你可能看到的例子很差

如果不返回其他对象,则不需要将结果赋回变量,这是非常正确的

但通常情况下,示例如下:

var MODULE = (function (my) {

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

    return my;
}(MODULE || {}));
//      ^^^^^^---------- note
…这使得将其分配回
模块
变量至关重要,以防尚未创建对象。如果还没有创建对象,
模块
将是
未定义的
,因此
模块| |{}
将计算为新创建的对象

在我看来,模块被分配了两次“方法”

除非代码运行两次

在第一个示例中,模块是这样声明的,以防它不存在吗

对。这样,如果您有几个不同的文件定义了
模块的不同部分,那么它们的运行顺序无关紧要(前提是它们不尝试使用尚未定义的部分)


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

变更1:

var MODULE = MODULE || {};
(function(my) {
    // ...
})(MODULE);
变式2:

var MODULE;
(function(my) {
    // ...
})(MODULE = MODULE || {});
与答案顶部的示例相比,将这两种变体中的任何一种写入示例的优点是,您不必记住在函数末尾返回
my
。(当然,如果您忘记了,它会很早就爆炸,您会很快发现并修复错误,所以这是一个非常小的优势。)