理解JavaScript中的bind()
从JavaScript开始,函数绑定可能是你最不关心的问题,但是当你意识到你需要解决如何将“this”的上下文保持在另外一个函数中的问题时,你可能没有意思到你真正需要的是Function.prototype.bind();
第一次遇到这种问题时,你可能倾向于将this赋予一个变量,这样你就可以在上下文改变时引用。很多人使用self,_this,有时是context去命名此变量。这样做是可用的,没有什么问题,但还有一个更好,更专注的方式。
Jack Archibald 就关于缓存this发了一个推文:我会为作用yu作用域做任何事情,但我绝不对这样赋值 that = this;
这对于我是很明显的,Sindre Sorhus这样指出:$this用来缓存jQuery对象,但在普通的JS中我不会这样做,我会使用.bind()
我居然忽略了这个聪明的建议长达几个月。
什么样的问题是我们真正需要解决的呢
下面的代码采用了变量来缓存上下文:
var myObj = {
specialFunction: function () {
},
anotherSpecialFunction: function () {
},
getAsyncData: function (cb) {
cb();
},
render: function () {
var that = this;
this.getAsyncData(function () {
that.specialFunction();
that.anotherSpecialFunction();
});
}
};
myObj.render();
如果我们将上面的函数调用改成这样:this.specialFunction()的话,我们会接收到以下的错误信息:
Uncaught TypeError: Object [object global] has no method 'specialFunction'
我们需要保持回调函数调用时myObj对象上下文的引用。像that.specialFunction()这样调用可以是我们保持这个上下文并且正确执行函数。但是,这个上下文我们可以使用Function.prototype.bind()加以解决。下面是重写的代码:
render: function () { this.getAsyncData(function () { this.specialFunction(); this.anotherSpecialFunction(); }.bind(this)); }
(未完)
翻译来源:https://www.smashingmagazine.com/2014/01/understanding-javascript-function-prototype-bind/

浙公网安备 33010602011771号