我正在查看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)
如果您在匿名函数中定义一个母牛(以保护全局命名空间) - 您如何使用它?
答案 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;
}());
当您不使用支持导出概念的包时,这是标准方法。
或者,如果您知道要在浏览器上下文中运行,则还可以选择在窗口对象上创建属性,因为它们始终会添加到全局对象中。