在我的Backbone代码中,我经常遇到这样的情况,即将闭包传递给某些函数,并且失去了“this”的上下文。
一段时间以来,我的解决方案一直是做我看到其他人做的事情:
var self = this;
this.deferred.done(function () {
self.render();
});
实际上我改用了_this = this
,但这并不重要。虽然它可以工作,但感觉很丑陋,而且有时需要经常这样做。因此,我正在尝试找到更好的方法来解决这个问题。我发现我可以这样做:
this.deferred.done(function () {
this.render();
}.apply(this));
我认为我也可以使用Underscore来完成这个任务:
this.deferred.done(_.bind(function () {
self.render();
}, this));
apply
方法看起来最简洁,但我觉得它有副作用(我还不知道是什么)。
编辑:
看一下这个JSbin,我在里面使用了类似于我提到的apply
的方法:
http://jsbin.com/qobumu/edit?js,console
它可以工作,但同时也会抛出一个错误。如果我将apply
更改为bind
,它就可以正常工作而且不会抛出错误。
.apply()
几乎肯定不是你想要的;我认为你在考虑Function.prototype.bind()
。 - Pointythis.deferred.done(this.render.bind(this))
可以在不输入单词 "function" 或复制的情况下正常工作。 - dandavis