3

这是Backbone包装器

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

为了比较。这是jQuery包装器:

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

关于 BackBone Wrapper:

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

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

但是我不明白'this'指的是什么?+ 为什么包装不同?

参考

MDN - 这个

4

1 回答 1

6

它有助于保留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);

但最后我猜也没关系。

于 2012-08-10T18:49:58.093 回答