Javascript 这些主干/下划线.bind()方法之间有什么区别?

Javascript 这些主干/下划线.bind()方法之间有什么区别?,javascript,backbone.js,underscore.js,Javascript,Backbone.js,Underscore.js,在一些SO成员的帮助下,我能够让我的测试项目使用绑定方法initialize1和initialize2;我不明白的是为什么初始化3不起作用 文档:有三个主要区别;一次只能在一个方法上工作,允许使用curry,并且返回绑定函数(这也意味着您可以在匿名函数上使用.bind): 将函数绑定到对象,这意味着无论何时调用该函数,该函数的值都将是对象。(可选)将参数绑定到函数以预填充它们,也称为currying 而同时绑定许多名为的方法,不允许使用curry,并将它们绑定到位: 绑定由methodNames

在一些SO成员的帮助下,我能够让我的测试项目使用绑定方法initialize1和initialize2;我不明白的是为什么初始化3不起作用


文档:

有三个主要区别;一次只能在一个方法上工作,允许使用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:)。请你编辑一下好吗?