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成员的帮助下,我能够让我的测试项目使用绑定方法initialize1和initialize2; 我不明白的是为什么initialize3不起作用?
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)
您绑定方法render以this使其与当前匹配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(即你扔掉了绑定函数).
| 归档时间: |
|
| 查看次数: |
4912 次 |
| 最近记录: |