它有助于保留this
内部函数中的值。
对未绑定函数* 的调用将重置this
为全局对象,即window
在浏览器的情况下。
看这个例子:
(function () {
alert("1: " + this); // this == myObject
(function () {
alert("2: " + this); // this == window
})();
(function () {
alert("3: " + this); // this == myObject
}).call(this);
}).call(myObject);
*) 即调用func()
而不是obj.func()
. this
在后一种情况下会变成obj
。
第一个澄清:
在backbone.js的情况下,他们包装代码的原因(function () {...}).call(this)
是这样你不需要知道全局对象的实际名称(global
在node.js的情况下)。
请参阅http://backbonejs.org/docs/backbone.html#section-4
第二个澄清:
如果脚本由浏览器运行,则与不在绑定函数的调用上下文中的this
对象相同。window
在独立的 JS 引擎(节点、犀牛……)中,全局对象不是命名的window
,而是global
.
jQuery 开发人员知道您想在浏览器中运行他们的脚本,因为如果您一开始就没有要操作的文档,那么您将没有什么乐趣。
Backbone.js 和underscore.js一样,是通用的,因此开发人员不知道全局对象的名称。他们不在乎。
所以当 jQuery 做
(function (window) {
...
})(window);
它也可以这样实现
(function () {
var window = this;
...
}).call(window);
因为this===window
(function () {
var window = this;
...
}).call(this);
向后阅读示例,看看骨干黑客做了什么。(他们称为全局对象root
。您可能需要阅读带注释的代码。)
我会选择
(function (root) {
...
})(this);
但最后我猜也没关系。