如果你在一个匿名函数中定义了一个对象——你如何使用它?

If you define an object in an anonymous function -- how do you use it?

本文关键字:一个对象 定义 何使用 如果 一个 函数      更新时间:2023-09-26

我正在看这个教程。我知道它正在使用匿名函数,从这个答案:为什么需要在同一行调用匿名函数?

我理解函数末尾的()将自动执行前面的函数——将(this)作为参数传递。我理解函数中的(this)是指全局的this。

我理解人们使用匿名函数模式来防止全局命名空间中的污染。

但是,我不明白你将如何使用在匿名函数中定义的母牛。例如,在python中,如果你导入一个名为from cow import cow的类,你可以导入Cow(name)。或者在java中输入new Cow (name)

如果你在一个匿名函数中定义了一个cow(为了保护全局命名空间)——你如何使用它?

注意

exports.Cow = Cow;

exports(主叫代码为this)增加一个Cow属性。因此,调用匿名函数时,无论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");
输出:

毛茛问候农民约翰逊

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

exports.Cow = Cow;

上面这行给window对象添加了一个Cow属性,这个属性的值就是对象的构造函数。

此时,因为window在浏览器中是全局的,所以可以在另一个文件中创建新的Cow对象:
var cow = new Cow();

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

var newglobal = (function() {
  var foo = {
   };
  return foo;
}());

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

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

相关文章: