无法理解backbone.js教程的例子

时间:2012-12-28 08:29:07

标签: javascript backbone.js underscore.js

我正在this tutorial之后学习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'的上下文丢失?

2 个答案:

答案 0 :(得分:8)

Q1:通过将jquery作为参数传递,你可以自己做两件事:

  1. 如果需要使用2个版本的jquery - 你准备好了
  2. 模块模式可能更好地被认为是封装良好且具有良好定义的依赖关系,因此通过声明jquery是一个参数 - 您声明了明确的依赖关系。当然还有其他方法(例如RequireJS),但这也是一种方式
  3. Q2:bindAll是来自Underscore.js的实用程序方法,它为特定方法绑定this - 因此,当调用该方法(例如作为回调)时,正确的{{1}将在其中使用。

    例如:

    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); 方法中的

    this是对上述makestuff的引用,而不是list函数在其中实际调用on时所处的任何上下文

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

答案 1 :(得分:2)

(function($){})(jQuery)jQuery传递给自行执行,并将其用作$。这可以确保您可以安全地使用闭包内的$符号,而不必担心与其他库甚至其他版本的jQuery的干扰。这种做法的一个常见例子也是传入windowdocument,然后在闭包内使用缩写:

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

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

  

将methodNames指定的对象上的多个方法绑定到   无论何时调用它们,都要在该对象的上下文中运行。非常   方便用于将用作事件的绑定函数   处理程序,否则将被调用相当无用的。   如果没有提供methodNames,则为对象的所有功能   属性将绑定到它。

请参阅 the annotated source 了解具体方法。