javascript如何在回调函数中得到this.variable

时间:2013-02-03 07:27:26

标签: javascript callback

在javascript中的以下自定义类中,在回调中,为什么this.obj什么都没有,但局部变量obj有我想要的东西?感谢。

function ClassTest(director) {
  this.obj = {"test1": "test1"};
}

function test1(input, callback) {
  callback("success");
}

ClassTest.prototype.test = function() {
  var obj = this.obj;
  test1("niuniu",function(e){
    console.log(this.obj);  // undefined
    console.log(obj);  // this one has stuff
    });
}

// run 
new ClassTest().test()

2 个答案:

答案 0 :(得分:14)

因为test1内的函数正在创建具有不同this上下文的新范围。典型的解决方案是bind或缓存this

结合:

test1("niuniu",function(e){
  console.log(this.obj);
}.bind(this));

缓存:

var self = this;
test1("niuniu",function(e){
  console.log(self.obj);
});

答案 1 :(得分:2)

至于这行代码:

console.log(obj);  // this one has stuff

它的工作原理与JavaScript闭包的工作方式有关。匿名函数中定义的代码可以访问其本地范围内的所有变量以及包含范围中定义的变量,因此可以使用obj。有关关闭的更多信息,请参阅How do JavaScript closures work?

然而,关键字this是对当前范围的引用。因为您是从匿名函数中访问this.obj,所以this指的是匿名函数本身 - 它没有定义obj属性。在扩展ClassTest原型的封闭函数中,this引用当前ClassTest对象,该对象确实定义了obj属性。