0

我正在按照本教程学习backbone.js ,但是在理解第一个示例时遇到了问题:

(function($){
  var ListView = Backbone.View.extend({
    ...
    initialize: function(){
      _.bindAll(this, 'render'); // fixes loss of context for 'this' within methods

       this.render(); // not all views are self-rendering. This one is.
    },
    ...
  });
  ...
 })(jQuery);

Q1:为什么要使用(function($){})(jQuery); 而不是完美的工作(function(){})();

Q2:_.bindAll(this, 'render')做什么的?它如何修复方法中“this”的上下文丢失?

4

2 回答 2

8

Q1:通过将 jquery 作为参数传入,您可以做两件事:

  1. 如果需要使用 2 个版本的 jquery - 你准备好了
  2. 模块模式可能更好地被认为是封装良好且具有良好定义的依赖关系,因此通过声明 jquery 是一个参数 - 您声明明确的依赖关系。当然还有其他方法(比如RequireJS),但这也是一种方法

Q2:bindAll是来自 Underscore.js 的实用方法,它绑定this特定方法 - 因此,当调用该方法(例如作为回调)时,this将在其中使用正确的方法。

例如:

(function($){
  var ListView = Backbone.View.extend({
    ...
    initialize: function(){
        // fixes loss of context for 'this' within methods
        _.bindAll(this, 'render', 'makestuff'); 

        this.render(); // not all views are self-rendering. This one is.
    },
    ...
    makestuff : function() { 
        ... 
        this.stuff = ... // some action on the list's instance
    }
  });
  ...
 })(jQuery);

在您的代码的某些部分中,您执行以下操作:

var list = new ListView({...});
$('#button').on('click', list.makestuff);

thisinmakestuff方法是对上述内容的引用,而不是函数在其中实际调用时list所处的任何上下文。onmakestuff

实际实现依赖于 usingapplycall函数将函数执行的上下文绑定到特定对象。

于 2012-12-28T08:47:52.617 回答
2

(function($){})(jQuery)传递jQuery给将其用作$. 这确保您可以安全地使用$闭包内的符号,而不必担心会干扰其他库甚至其他版本的 jQuery。这种做法的一个常见示例也是传入,window然后document在闭包内使用速记:

(function(w, d, $){
$(w).resize(function({}); //equals $(window) now
})(window, document, jQuery);

下划线_.bindAll执行以下操作:

绑定由 methodNames 指定的对象上的许多方法,以便在调用它们时在该对象的上下文中运行。对于将用作事件处理程序的绑定函数非常方便,否则将使用相当无用的 this 来调用它们。如果没有提供 methodNames,则对象的所有函数属性都将绑定到它。

请参阅带注释的来源以了解操作方法。

于 2012-12-28T08:52:57.090 回答