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成员的帮助下,我能够让我的测试项目使用绑定方法initialize1和initialize2;我不明白的是为什么initialize3不起作用?
答案 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);
的返回值(即你扔掉了绑定函数)。