在您的示例中,全局对象接收fn
. 它是window
浏览器的对象。那是因为您在没有特定上下文的情况下就地调用该函数(有效地构造了一个新范围)。最后,您的module
对象只是对window
(因为return this;
)的引用。
是什么this
?
在 JavaScript 中,this
是当前上下文,即在特定时间调用函数的对象。它不是函数的“持有者”。您始终可以从其他对象中“窃取”该方法,并将apply
其(字面意思)转移到您自己的对象中。
arguments
假设您出于某种原因想要对对象进行切片。它看起来就像一个数组,但它不是一个数组。arguments.slice(2,4)
不起作用(假设 ECMAScript < 5)。该怎么办?
Array.prototype.slice.apply(arguments, [2,4]);
您需要从 Array 原型中窃取该slice
函数,并在您的参数上使用 if 。在slice
调用内部,“this”是特定时间的参数对象。
如何构造一个有效的模块?
你的工作是return
模块对象。你不想弄乱上下文。只要您不直接在模块对象上应用该功能,它就无关紧要。
最简单的解决方案是最简单的。
var module = (function() {
// do something internally, great for "private" stuff
// then return the "public" interface
return {
doSomething: function() {
// do something
},
introduce: function() {
console.log(this);
}
};
})();
module.introduce(); // Object {doSomething: function, introduce: function}
module.doSomething();
另一种方法。
或者,this
如果您真的愿意,您可以使用应用程序来完成您的工作。
var module = {};
(function(){
this.doSomething = function() {
// do something
};
this.introduce = function() {
console.log(this);
};
}).apply(module);
module.introduce(); // Object {doSomething: function, introduce: function}
module.doSomething();
请注意,这几乎等于“新”调用。
有更多同样有效的方法可以做到这一点,但第一个提出的方法经常使用并且非常清晰。无论如何,一切都取决于您的代码约定。