javascript:模块vs全局函数 - 有什么区别?

时间:2014-06-11 11:43:14

标签: javascript function module

像这样的模块之间的主要区别是什么

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)你不能两次调用模块。

但作者将模块模式描述为一件好事,但我无法看清楚。而且因为你不能两次调用模块,你不能有多个模块实例,我认为在很多情况下它甚至是一个缺点。

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