'self = this'应用还是绑定?(骨干)

'self = this' vs apply or bind? (Backbone)

本文关键字:绑定 骨干 应用 self this      更新时间:2023-09-26

在我的主干代码中,我经常遇到这样的情况:我将传递一个闭包给某些函数,而失去了'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时,当您认为您正在分配回调时,您正在执行函数。