Javascript 这些主干/下划线.bind()方法之间有什么区别?
在一些SO成员的帮助下,我能够让我的测试项目使用绑定方法initialize1和initialize2;我不明白的是为什么初始化3不起作用Javascript 这些主干/下划线.bind()方法之间有什么区别?,javascript,backbone.js,underscore.js,Javascript,Backbone.js,Underscore.js,在一些SO成员的帮助下,我能够让我的测试项目使用绑定方法initialize1和initialize2;我不明白的是为什么初始化3不起作用 文档:有三个主要区别;一次只能在一个方法上工作,允许使用curry,并且返回绑定函数(这也意味着您可以在匿名函数上使用.bind): 将函数绑定到对象,这意味着无论何时调用该函数,该函数的值都将是对象。(可选)将参数绑定到函数以预填充它们,也称为currying 而同时绑定许多名为的方法,不允许使用curry,并将它们绑定到位: 绑定由methodNames
文档:有三个主要区别;一次只能在一个方法上工作,允许使用curry,并且返回绑定函数(这也意味着您可以在匿名函数上使用
.bind
):
将函数绑定到对象,这意味着无论何时调用该函数,该函数的值都将是对象。(可选)将参数绑定到函数以预填充它们,也称为currying
而同时绑定许多名为的方法,不允许使用curry,并将它们绑定到位:
绑定由methodNames指定的对象上的许多方法,以便在调用这些方法时在该对象的上下文中运行
这两段代码大致相当:
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);
},
});
但没有任何bindAll
与此等效:
// 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');
这使得f()
与o.m1('pancakes')
相同(这是)
所以,当你这么说的时候:
f = _.bind(o, o.m1, 'pancakes');
_.bindAll(this, 'render');
this.model.bind('change', this.render);
您正在绑定方法render
以使this
与当前this
匹配,然后将this.render
绑定到this.model
上的更改事件
当你这么说的时候:
f = _.bind(o, o.m1, 'pancakes');
_.bindAll(this, 'render');
this.model.bind('change', this.render);
你也在做同样的事情。这是:
this.model.bind('change', _.bind(this.render, this));
不起作用,因为您正在丢弃
.bind
的返回值(即,您丢弃绑定函数)。啊。这澄清了很多。可以肯定地说u.bindAll修改了模型的实际方法,影响了对它的每个后续调用;虽然.bind保留原始方法,但返回一个修改(绑定)版本供使用?@rkw:Right,.bind
返回绑定函数(或者可能包装函数并返回绑定包装器),并且(AFAIK)保留原始方法。哎呀,我的错误。您的措辞与addy osmani的书中关于绑定的讨论非常相似,这本书中有一个小的拼写错误“extrend”应该是“extend”。我不能只做一次更改,因为编辑要求至少更改4-5个字符。我不想做其他随机更改只是为了推动编辑通过。关于这类事情,我是O-C:)。请你编辑一下好吗?