在外部函数中,this.foo是bar,这是我的预期。但是,在内部函数中,this.foo是未定义的,这是非常令人惊讶的。有人可以帮我吗?感谢。
var myObject = {
foo: "bar",
func: function () {
console.log("outer func: this.foo = " + this.foo);
(function () {
console.log("inner func: this.foo = " + this.foo);
}());
}
};
myObject.func();
答案 0 :(得分:3)
在外部函数中,这引用了myObject,因此可以正确引用和访问foo。
在内部函数中,它是一个闭包,但这不再引用myObject。因此,this.foo在内部函数中是未定义的(在ECMA 5之前,内部函数中的这将引用全局窗口对象;而从ECMA 5开始,内部函数中的这将是未定义的。) 要解决这个问题,我们可以在引用它之前将它存储在像self这样的局部变量中。
var myObject = {
foo: "bar",
func: function () {
var self = this;
console.log("outer func: self.foo = " + self.foo);
(function () {
console.log("inner func: self.foo = " + self.foo);
}());
}
};
myObject.func();
答案 1 :(得分:0)
第一个实现是:
var myObject = {
foo: "bar",
func: function () {
console.log("outer func: this.foo = " + this.foo);
(function (self) {
console.log("inner func: self.foo = " + self.foo);
}(this));
}
};
myObject.func();
第二个实现是:
var myObject = {
foo: "bar",
func: function () {
console.log("outer func: this.foo = " + this.foo);
(function () {
console.log("inner func: this.foo = " + this.foo);
}.bind(this));
}
};
myObject.func();