我对增强模块模式不熟悉,而且我已经看过很多这样的例子了:
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是这样的情况,以防它不存在?
谢谢!
答案 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
。 (当然,如果你忘了,它会很早就爆炸,你会很快发现并修复这个错误,所以这是非常小的优势。)