理解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/

 

posted @ 2018-07-06 15:42  JQ_Chan  阅读(113)  评论(0)    收藏  举报