如果在匿名函数中定义对象 - 如何使用它?

时间:2014-03-23 14:53:54

标签: javascript design-patterns

我正在查看this教程。我知道它使用匿名函数,从这个答案:Why do you need to invoke an anonymous function on the same line?

我理解函数末尾的()将自动执行先前的函数 - 传递(this)作为参数。我知道函数中的(this)是指global this

据我所知,人们使用这种匿名函数模式来防止全局命名空间中的污染。

但是,我不明白你将如何使用匿名函数中定义的牛。例如,在python中,如果您导入了类奶牛from cow import cow,则可以执行Cow(name)。或者在java中,您可以new Cow (name)

如果您在匿名函数中定义一个母牛(以保护全局命名空间) - 您如何使用它?

3 个答案:

答案 0 :(得分:2)

注意这一行

exports.Cow = Cow;

这会将Cow属性添加到exports,其中调用代码为this。因此,当函数返回时,调用匿名函数时this将具有Cow属性(这是构造函数)。

编辑:对于那些直接在他们面前想要这个例子的人来说,这里是OP链接中与该问题相关的代码:

(function(exports) {
  "use strict";

  function Cow(name) {
    this.name = name || "Anon cow";
  }
  exports.Cow = Cow;

  Cow.prototype = {
    greets: function(target) {
      if (!target)
        throw new Error("missing target");
      return this.name + " greets " + target;
    }
  };
})(this);

结果的使用方式与执行以下代码后使用Cow的方式完全相同:

var Cow = function (name) {
    this.name = name || "Anon cow";
}

Cow.prototype = {
    greets: function(target) {
        if (!target)
            throw new Error("missing target");
        return this.name + " greets " + target;
    }
};

唯一的区别是(在这种情况下)匿名函数函数在严格模式下进行评估,而不考虑全局设置,而不更改全局设置。在这两种情况下,您都可以:

var aCow = new Cow("Buttercup");
aCow.greet("Farmer Johnson");

输出:

  

Buttercup迎接Farmer Johnson

答案 1 :(得分:1)

该代码正在做的是定义Cow对象,然后通过以下行:

exports.Cow = Cow;

上面的行向Cow对象添加了window属性,此属性的值是对象构造函数。

此时,由于window在浏览器中是全局的,因此您可以在另一个文件中通过以下内容创建新的Cow对象:

var cow = new Cow();

答案 2 :(得分:0)

允许匿名函数返回结果,就像任何其他函数一样。如果需要将创建的项目导出到全局命名空间,则可以返回它们,如下所示:

var newglobal = (function() {
  var foo = {

   };
  return foo;
}());

当您不使用支持导出概念的包时,这是标准方法。

或者,如果您知道要在浏览器上下文中运行,则还可以选择在窗口对象上创建属性,因为它们始终会添加到全局对象中。