在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()
答案 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
属性。