'self = this'应用还是绑定?(骨干)
'self = this' vs apply or bind? (Backbone)
在我的主干代码中,我经常遇到这样的情况:我将传递一个闭包给某些函数,而失去了'this'的上下文。
一段时间以来,我的解决办法就是像别人那样做:
var self = this;
this.deferred.done(function () {
self.render();
});
或者实际上我换成了_this = this
,但这不是重点。它是有效的,但感觉很丑,有时我不得不经常这样做。所以我在想一个更好的方法。我知道我可以这样做:
this.deferred.done(function () {
this.render();
}.apply(this));
我想我也可以用下划线来做这个:
this.deferred.done(_.bind(function () {
self.render();
}, this));
apply
方法似乎是最简洁的,但我觉得它有副作用(我只是不知道它是什么)
看看这个JSbin,我使用了类似于我提到的应用程序:http://jsbin.com/qobumu/edit?js,控制台
可以工作,但同时会抛出错误。如果我将apply
更改为bind
,它可以工作并且不会抛出错误。
-
函数。Bind是一个本机方法,不需要下划线,除非你是为老式浏览器编写代码。正如@dandavis所说:
this.deferred.done(this.render.bind(this))
(但注意bind
也可以绑定函数参数,而不仅仅是this
) -
如果你实际上是为先进的浏览器或node.js 4编码,你可以使用箭头函数,将
this
在词法上绑定到函数定义的范围内的任何东西,所以你可以这样写:this.deferred.done(() => { this.render() });
它们的作用不同。
// returns a function with `this` set to what you want.
_.bind(fn, this);
// or
fn.bind(this);
// EXECUTES the function with `this` set to what you want.
fn.apply(this);
在你的例子中它根本不是回调。当您使用apply
时,当您认为您正在分配回调时,您正在执行函数。
相关文章:
- 在VanillaJS中模拟模型双向数据绑定
- 无法通过数组映射绑定
- 主干-不管怎样,检查事件以前是否绑定过
- 骨干.js将其绑定到 setInterval
- 骨干JS,绑定模型查看
- 为什么“这个”没有与这个骨干视图一致地绑定
- 骨干.js:如何绑定渲染
- 在骨干路由器的一个操作中绑定多个视图
- 在骨干中使用手动ID绑定是否正确.js孩子到父母
- 骨干绑定到动态元素
- 将骨干模型和集合绑定到源图
- 骨干:删除赢得't绑定
- 'self = this'应用还是绑定?(骨干)
- 将jquery-ui事件绑定到骨干事件
- 将多个函数绑定到骨干中的同一个事件
- 使用unbind解除对骨干事件的绑定
- 绑定骨干表单视图ui到模型更改以启用和禁用"保存"按钮
- 我如何绑定键在骨干
- 骨干-在一个$el上绑定多个视图(事件是重复的)
- 奇怪的问题绑定事件与骨干,“;这个“;没有更新