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
。(当然,如果您忘记了,它会很早就爆炸,您会很快发现并修复错误,所以这是一个非常小的优势。)