包装库| jQuery与Backbone

时间:2012-08-10 18:41:30

标签: javascript jquery backbone.js

这是Backbone包装器

(function(){
    // Backbone.js
}).call(this);

进行比较。这是jQuery包装器:

(function( window, undefined ) {
    // jQuery.js
})( window );

关于BackBone包装器:

我理解需要立即调用(通过调用)函数表达式 - 提供隐私(封装)

我理解为什么它是一个匿名函数 - 减少全局符号。

但是我不明白'这个'指的是什么? +为什么包装器有区别?

参考

MDN - this

1 个答案:

答案 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


第二次澄清:

如果脚本是由浏览器运行的,如果您不在绑定函数的调用上下文中,则thiswindow是同一个对象。在独立的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);

但最后我认为并不重要。