这些Backbone / Underscore .bind()方法有什么区别?

时间:2011-08-17 03:12:45

标签: javascript backbone.js underscore.js

window.SomeView = Backbone.View.extrend({
    initialize1: function() {
        _.bindAll(this, 'render');
        this.model.bind('change', this.render);
    },

    initialize2: function() {
        this.model.bind('change', _.bind(this.render, this));
    },

    initialize3: function() {
        _.bind(this.render, this);
        this.model.bind('change', this.render);
    },
});

在一些SO成员的帮助下,我能够让我的测试项目使用绑定方法in​​itialize1和initialize2;我不明白的是为什么initialize3不起作用?

文档: _.bind(function, object, [*arguments])

1 个答案:

答案 0 :(得分:23)

主要有三个不同之处; _.bind一次仅适用于一种方法,允许currying,返回绑定函数(这也意味着您可以在匿名函数上使用_.bind):

  

函数绑定到对象,这意味着无论何时调用该函数, this 的值都将是对象即可。 (可选)将参数绑定到函数以预先填充它们,也称为 currying

_.bindAll一次绑定多个命名的方法,不允许currying,并将其绑定到位:

  

methodNames 指定的对象上的多个方法绑定,以便在调用它们时在该对象的上下文中运行。

所以这两个代码块大致相同:

// Bind methods (not names) one a time.
o.m1 = _.bind(o.m1, o);
o.m2 = _.bind(o.m2, o);

// Bind several named methods at once.
_.bindAll(o, 'm1', 'm2');

但是没有bindAll等同于此:

f = _.bind(o, o.m1, 'pancakes');

这使得f()o.m1('pancakes')相同(这是currying)。


所以,当你这样说时:

_.bindAll(this, 'render');
this.model.bind('change', this.render);

您绑定方法render以使this与当前this匹配,然后您将this.render绑定到{{1}上的更改事件}}

当你这样说时:

this.model

你做的是同样的事情。这个:

this.model.bind('change', _.bind(this.render, this));

不起作用,因为你丢弃了_.bind(this.render, this); this.model.bind('change', this.render); 的返回值(即你扔掉了绑定函数)。