这些Backbone/Underscore .bind()方法之间的区别是什么?

What is the difference between these Backbone/Underscore .bind() methods?

本文关键字:之间 区别 是什么 方法 Backbone Underscore bind 这些      更新时间:2023-09-26
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不起作用?

文档: _。Bind (function, object, [*arguments])

有三个主要区别;_.bind一次只作用于一个方法,允许柯里化,并且返回绑定函数(这也意味着您可以在匿名函数上使用_.bind):

函数绑定到对象,这意味着无论何时调用该函数,这个的值将是对象。可选地,将参数绑定到函数以预填充它们,也称为套用

_.bindAll一次绑定了许多命名的方法,不允许柯里化,并且就地绑定它们:

对象上绑定若干方法,由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')相同(这是curry)。


所以,当你说:

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

你将方法render绑定到与当前this匹配的this,然后你将this.render绑定到this.model上的更改事件。

当你说:

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

你在做同样的事情。这:

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

不工作,因为你扔掉了_.bind的返回值(即你扔掉了绑定函数)。