这些Backbone/Underscore .bind()方法之间的区别是什么?
What is the difference between these Backbone/Underscore .bind() methods?
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
的返回值(即你扔掉了绑定函数)。
相关文章:
- 全局变量和全局对象的属性之间有什么区别吗
- JavaScript中的函数和对象之间没有区别吗?
- 在下划线中使用_(obj).map(callback)和_.map(obj,callback)之间的区别
- javascript函数的:和=之间的区别
- 什么's本地node.js服务器和python简单http服务器之间的区别
- 函数中this和var之间的区别
- “util.inherits”和在NodeJS中扩展原型之间的区别
- Math.min()和Math.max()之间有什么区别?在Javascript中
- webpack开发模式和生产构建模式之间有什么区别
- servlet和代理servlet之间的区别
- Javascript 类型未定义和 void 之间的区别
- Javascript-defineProperty和直接在对象上定义函数之间的区别
- 关于承诺/A+规范,术语“当时可”和“承诺”之间有什么区别
- 布局引擎和javascript引擎之间的区别
- 什么's extjs中的mon()和on()之间的区别
- type=text/javascript和language=javascript之间的区别
- 函数()和新函数()之间的区别
- JavaScript中let和var之间的区别
- 蓝鸟的done()和spread()之间的区别
- Node.js HTTP/NET——连接和请求之间的区别