我有一个带有方法的对象,我想将其作为回调传递给函数。但是,在回调中,this
不再引用我的对象。为什么不呢?
我很熟悉在传递函数文字时使用变量解决问题:
var obj = {
a: function () {
var me = this;
console.log(this);
setTimeout(function () {
console.log(this); // Not obj
console.log(me); // This works!
}, 100);
}
};
在这种情况下我该如何解决?
var obj = {
b: function () {
setTimeout(this.callback, 100);
},
callback: function () {
console.log(this); // =(
}
};
答案 0 :(得分:9)
是的,this
在Javascript中可能有些棘手。问题是它的价值取决于how you call the function。
obj.callback(); //ok
var f = obj.callback;
f(); //does not look like a method call
//Javascript does not pass the this!
通常的解决方法是传递一个像b)中所做的包装回调,除了me
变量的公用名是that
(有时你也会看到self
)
var that = this;
setTimeout( function(){ return that.callback(); }, 300);
另一种方法是使用函数中的bind方法
setTimeout( this.callback.bind(this) , 300)
请注意,IE 8不支持绑定(在这种情况下您可能需要填充程序)。
更多信息:
Maintaining the reference to "this" in Javascript when using callbacks and closures