这是Backbone包装器
(function(){
// Backbone.js
}).call(this);
进行比较。这是jQuery包装器:
(function( window, undefined ) {
// jQuery.js
})( window );
关于BackBone包装器:
我理解需要立即调用(通过调用)函数表达式 - 提供隐私(封装)
我理解为什么它是一个匿名函数 - 减少全局符号。
但是我不明白'这个'指的是什么? +为什么包装器有区别?
参考
答案 0 :(得分:6)
它有助于在内部函数中保留this
的值。
对未绑定函数的调用*会将this
重置为全局对象,例如window
以防浏览器。
请参阅this example:
(function () {
alert("1: " + this); // this == myObject
(function () {
alert("2: " + this); // this == window
})();
(function () {
alert("3: " + this); // this == myObject
}).call(this);
}).call(myObject);
*)I.e。调用func()
而不是obj.func()
。在后一种情况下,this
将成为obj
。
首先澄清:
在backbone.js的情况下,他们将代码包装在(function () {...}).call(this)
中的原因是这样你不需要知道全局对象的实际名称(如果是节点,则global
的.js)。
请参阅http://backbonejs.org/docs/backbone.html#section-4
第二次澄清:
如果脚本是由浏览器运行的,如果您不在绑定函数的调用上下文中,则this
与window
是同一个对象。在独立的JS引擎(node,rhino ...)中,全局对象的名称不是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);
但最后我认为并不重要。