我有两个类似的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()