我有两个类似的Javascript“对象”。

var Object2 = new (function() {
    this.FetchData = function(callback) {
        // do some stuff
        callback(data);
    };
});

var Object1 = new (function() {

    this.DisplayStuff = function() {

    };

    this.LoadData = function() {
        Object2.FetchData(this.OnData);
    };

    this.OnData = function(data) {
        // this == window
        this.DisplayStuff();   // doesn't work
    };

});

当Object1收到对OnData的回调时,“this”的值将设置为window。 有什么办法可以解决这个问题,以便OnData中的“this”值将成为Object1 而不是window的实例?

最佳答案

这样做的简单方法是将对此的引用存储在变量中,然后使用call()方法:

this.LoadData = function() {
    var self = this;
    Object2.FetchData(function () { self.OnData.call(self) });
};

如果您经常这样做,则可能要考虑在ECMAScript第5版中的函数原型(prototype)上使用.bind()方法。可以在不受支持的地方实现此方法:
// From Prototype.js
if (!Function.prototype.bind) { // check if native implementation available
  Function.prototype.bind = function(){
    var fn = this, args = Array.prototype.slice.call(arguments),
        object = args.shift();
    return function(){
      return fn.apply(object,
        args.concat(Array.prototype.slice.call(arguments)));
    };
  };
}

和结果函数调用:
this.LoadData = function() {
    Object2.FetchData(this.OnData.bind(this));
};

PrototypeJS - bind()

09-10 05:11
查看更多