为什么不使用_.bind而不是_.bindAll?

时间:2014-07-05 23:14:04

标签: javascript backbone.js underscore.js

在这个骨干示例中:

http://arturadib.com/hello-backbonejs/docs/1.html

(function($){
  var ListView = Backbone.View.extend({
    el: $('body'), // attaches `this.el` to an existing element.
    initialize: function(){
      _.bindAll(this, 'render'); // fixes loss of context for 'this' within methods
      this.render(); // not all views are self-rendering. This one is.
    },
    render: function(){
      $(this.el).append("<ul> <li>hello world</li> </ul>");
    }
  });
  var listView = new ListView();
})(jQuery);

因为只传递了一个参数(函数),所以我没有看到使用bindAll()的重点。

以下是underscore API

1 个答案:

答案 0 :(得分:1)

_.bindAll用新方法替换对象中的方法,并将上下文设置为对象。 _.bind返回一个新函数。

这相当于:

this.render = _.bind(this.render, this)

这是更多的verbos,但无论如何都在underscore内完成:

_.bindAll = function(obj) {
    var funcs = slice.call(arguments, 1);
    if (funcs.length === 0) throw new Error('bindAll must be passed function names');
    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); //in this line
    return obj;
  };