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

rkw*_*rkw 9 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);
    },
});
Run Code Online (Sandbox Code Playgroud)

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

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

mu *_*ort 23

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

绑定函数到一个对象,这意味着每当调用该函数时,的值将是对象.(可选)将参数绑定到函数以预填充它们,也称为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');
Run Code Online (Sandbox Code Playgroud)

但没有bindAll相当于这个:

f = _.bind(o, o.m1, 'pancakes');
Run Code Online (Sandbox Code Playgroud)

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


所以,当你这样说时:

_.bindAll(this, 'render');
this.model.bind('change', this.render);
Run Code Online (Sandbox Code Playgroud)

您绑定方法renderthis使其与当前匹配this,然后您绑定this.render到更改事件this.model.

当你这样说:

this.model.bind('change', _.bind(this.render, this));
Run Code Online (Sandbox Code Playgroud)

你做的是同样的事情.还有这个:

_.bind(this.render, this);
this.model.bind('change', this.render);
Run Code Online (Sandbox Code Playgroud)

不起作用,因为你丢弃了返回值_.bind(即你扔掉了绑定函数).

  • 啊.这澄清了很多.是否安全地说_.bindAll修改了模型的实际方法,影响了对它的每次后续调用; 虽然_.bind保留原始方法,但返回修改(绑定)版本以供使用? (2认同)