js`this`上下文回调

时间:2014-05-20 23:56:28

标签: javascript jquery callback this

给定类函数

game.PlayScreen = me.ScreenObject.extend({  

    onResetEvent: function() {
        this.setAll(); //calls setAll(), which calls setGlobals()
        this.saveNextLevelData(this.setAll);
    },

    saveNextLevelData : function (callback) {
        $.get("./php/CRUD.php", {},
            function (returned_data) {
                callback(); //however, the callback of setAll throws 
                           `undefined is not a function` error
            }
    },

    setAll : function () {
         log("setAll called");
         this.setGlobals();
    },

    setGlobals : function () {
         log("setGlobals called");
    }
});

基本上,我对调用回调函数时this上下文丢失的方式感到困惑。

在上面的代码中,

  • 作品this.setAll()直接来自onResetEvent输出"setAll called""setGlobals called"

  • 休息callback()this.setAll()输出$.get调用"setAll called",但this.setGlobals();打破......我认为由于丢失this上下文...它输出Uncaught TypeError: undefined is not a function

当您调用包含属于父对象的函数(在本例中为this)的回调函数时,我试图遵循this的上下文。如果我想从this.setGlobals()的回调中调用this.setAll(),我究竟需要在哪里进行绑定?

由于

1 个答案:

答案 0 :(得分:1)

我认为最好从调用者部分传递上下文,可以使用$.proxy() / Function.bind()完成,所以

this.saveNextLevelData($.proxy(this.setAll, this));

另一种解决方案是将当前对象作为上下文传递给来自ajax回调的回调,问题是默认情况下this在回调中将引用ajax设置对象。所以

saveNextLevelData : function (callback) {
    var self = this;
    $.get("./php/CRUD.php", {},
        function (returned_data) {
            callback.call(self);
        }
},