像这样的模块之间的主要区别是什么
var MODULE = (function () {
var my = {},
privateVariable = 1;
function privateMethod() {}
my.moduleProperty = 1;
my.moduleMethod = function () {};
return my;
}());
和这样的简单函数
function MODULE_Func() {
var my = {},
privateVariable = 1;
function privateMethod() {}
my.moduleProperty = 1;
my.moduleMethod = function () {};
return my;
};
var MODULE = MODULE_Func();
我读了一篇关于模块的文章,其中作者将模块的优点描述为:“模块使用匿名函数的闭包维护私有内部状态。”
即,我认为他的意思是'privateVariable'和'privateMethod'是模块的内部信息,而且不能从外部接受。但是在简单的函数中,'privateVariable'和'privateMethod'也是内部的,不能从外部接受。我能看到的唯一区别是模块是一个无穷大的函数,因此它:1)不会污染全局状态2)你不能两次调用模块。
但作者将模块模式描述为一件好事,但我无法看清楚。而且因为你不能两次调用模块,你不能有多个模块实例,我认为在很多情况下它甚至是一个缺点。
答案 0 :(得分:0)
但作者将模块模式描述为一件好事,但我无法看到什么
嗯,你自己说过: 1)不会污染全局状态2)你不能两次调用模块。如果你想要它们就是优点。
因为你不能两次调用模块,你不能有多个模块实例,我认为在很多情况下它甚至是一个缺点。
这些模块是静态。实际上,它们不应该具有内部状态而只能具有本地(内部)变量,例如对于辅助函数。
如果您需要多个实例,请不要使用类似单身的模块。使用构造函数(“class”),就像在第二个示例中一样。但是,您仍然可以将模块用作您的类的命名空间。
答案 1 :(得分:-1)
区别在于第一个
var MODULE =(function(){})();
MODULE
指的是正在执行的匿名函数将返回的任何内容。如果它什么也没有返回,那么** MODULE 将被设置为undefined。正在执行的函数是IIFE(立即调用的函数表达式),More info here。它在页面加载时执行,因为 MODULE 由全局窗口引用。
,第二个是函数MODULE_func(){}, MODULE_FUNC
是函数本身的名称,此函数现在是全局窗口的一个属性,意味着它可以是由全局窗口引用为window.MODULE_func(){};
,另一个也可以引用,但注意区别,另一个是没有名称的匿名函数,并且具有 TWO 引用。这个有一个名字和一个推荐人..
var MODULE =(function(){})();
可以参考window.MODULE; MODULE;
功能MODULE_func(){}
可以参考window.MODULE_func;的 ONLY 强>