包装库| jQuery与Backbone

3 javascript jquery backbone.js

这是Backbone包装器

(function(){
    // Backbone.js
}).call(this);
Run Code Online (Sandbox Code Playgroud)

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

(function( window, undefined ) {
    // jQuery.js
})( window );
Run Code Online (Sandbox Code Playgroud)

关于BackBone包装器:

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

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

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

参考

MDN - 这个

kay*_*kay 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);
Run Code Online (Sandbox Code Playgroud)

*)即打电话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);
Run Code Online (Sandbox Code Playgroud)

它也可以这样实现

(function () {
    var window = this;
    ...
}).call(window);
Run Code Online (Sandbox Code Playgroud)

因为 this===window

(function () {
    var window = this;
    ...
}).call(this);
Run Code Online (Sandbox Code Playgroud)

向后阅读示例以了解骨干黑客所做的事情.(它们调用全局对象root.您可能想要读取带注释的代码.)

我会选择一个

(function (root) {
    ...
})(this);
Run Code Online (Sandbox Code Playgroud)

但最后我觉得没关系.