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 模块模式中的这个关键字?_Javascript_Design Patterns_Global Object - Fatal编程技术网

Javascript 模块模式中的这个关键字?

Javascript 模块模式中的这个关键字?,javascript,design-patterns,global-object,Javascript,Design Patterns,Global Object,我刚开始在一家新公司工作,并注意到他们的许多JS中有一些对我来说完全错误的东西。我有点犹豫在没有确认这是错误的情况下提出来,因为我还很年轻,我不是JS专家,这只是我的第二天,我不想看起来很愚蠢 因此,通常我希望模块模式看起来像: MODULENAME = MODULENAME || {}; MODULENAME.SUBMODULENAME = (function() { var bla = {}; bla.somefunction = function() {

我刚开始在一家新公司工作,并注意到他们的许多JS中有一些对我来说完全错误的东西。我有点犹豫在没有确认这是错误的情况下提出来,因为我还很年轻,我不是JS专家,这只是我的第二天,我不想看起来很愚蠢

因此,通常我希望模块模式看起来像:

MODULENAME = MODULENAME || {};

MODULENAME.SUBMODULENAME = (function() {
    var bla = {};

    bla.somefunction = function() {
        //do stuff
    };

    //add more stuff to bla
    return bla;
}());
他们所有的代码都是:

MODULENAME = MODULENAME || {};

MODULENAME.SUBMODULENAME = (function() {
    var that = this;

    that.somefunction = function() {
        //do stuff
    };

    //add more stuff to that
    return that;
}());
当然,因为函数不是作为带有
new
关键字的构造函数调用的,也不是作为方法调用的,
this
被绑定到
窗口
,他们将
that
定义为
this
。因此,它们基本上转储全局对象中的所有内容,并且它们的所有子模块名称实际上都是
窗口的别名。有什么理由有人想这么做吗?或者这真的像我认为的那样错误吗

编辑:

我把
var
放在子模块定义之前犯了一个错误,最初我写了一些稍微不同的东西,忘了删除
var
。我也试着让这个例子更清楚一点,希望现在我的意思更清楚一点

编辑2:

此外,我还查看了Firebug中执行的脚本,它们肯定会将所有内容添加到
窗口
,该对象完全是一团糟。

是的,它看起来是错误的

MODULENAME = MODULENAME || {}; // missing var

var MODULENAME.SUBMODULENAME = (function() { // probably the missing var from above...
    var that = this;
    //add some stuff to that
    return that; // that is the WINDOW- wrong.
}());
对于它可能造成的损坏:

var x = function() {
    alert('out');
}
var MODULENAME = MODULENAME || {};

MODULENAME.SUBMODULENAME = (function() {
    var that = this;
    that.x = function() {
        alert('DAMAGE');
    }
}());

x();​ // alert DAMAGE and not "out" - messed up with the global object!

模块模式的使用不正确,这也是函数表达式在函数声明中不能使用的原因之一。如果目的是创建全局函数(我怀疑是这样),那么它们应该使用:

function somefuncion() {
  ...
}
如果他们的意图是将属性(在本例中为方法)添加到对象中,那么:

MODULENAME.SUBMODULENAME.somemethod = function() { /* do stuff */ };
如果需要有条件地创建方法(例如基于特征检测),则以下方法可能适用:

(function(global, undefined) {

  // In here global is the global object
  global.MODULENAME = global.MODULENAME || {};
  global.MODULENAME.SUBMODULENAME = global.MODULENAME.SUBMODULENAME || {};

  // and undefined is undefined, belt and braces approach
  undefined = void 0;

  // Direct assignment
  function somemethod() {
      //do stuff      
  };

  // Assign directly to the "namespace" object
  MODULENAME.SUBMODULENAME.somemethod = somemethod;

  // Conditional assignment
  if ( sometest ) {
    MODULENAME.SUBMODULENAME.anothermethod = function(){...};

  // Try another way...
  } else if (someOtherTest) {
    MODULENAME.SUBMODULENAME.anothermethod = function(){...};

  // Default
  } else {
    MODULENAME.SUBMODULENAME.anothermethod = function(){...};
  }

  // Clean up 
  global = null;

}(this)); 

上面提到的一个问题是,在外部函数中声明的每个函数都有一个到函数对象及其环境的闭包,因此这有点浪费资源。更有效的方法是保持简单,只在真正需要的地方使用模块模式,而在不需要的地方使用普通函数声明和赋值。没有那么时髦,但更实用。

对不起,我不明白你的问题。你能解释清楚吗?你刚开始在一家新公司工作,发现了一些你不确定的东西,而不是问你的同事,他们知道代码,为什么你会这样在网上发布?似乎是一种不好的开始新作业的方式。还有一些看起来不对劲的地方:
var
语句应该在第一行,而不是第二行。您确定代码没有以
}.call({})结尾吗