匿名函数/闭包是否应该保留创建它的对象的范围?
var myObject = {
foo: "bar",
func: function() {
var self = this;
console.log("outer func: this.foo = " + this.foo);
console.log("outer func: self.foo = " + self.foo);
(function() {
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
}());
}
};
myObject.func();
这种方式产生相同的结果。
var myObject = {
foo: "bar",
func: function() {
var self = this;
console.log("outer func: this.foo = " + this.foo);
console.log("outer func: self.foo = " + self.foo);
return function() {
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
};
}
};
myObject.func()();
//输出
outer func: this.foo = bar
outer func: self.foo = bar
inner func: this.foo = undefined
inner func: self.foo = bar
答案 0 :(得分:6)
这只是JavaScript的核心概念(特别是ECMAScript5)。匿名函数,特别是在闭包中,不保留上下文。
您可以这样做:
(function() {
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
}).call(this);
那是因为你实际上是在调用这个函数。如果您传入回调,则可以改为使用Function.prototype.bind
。
如果你正在使用ECMAScript6,你可以使用箭头函数来保留匿名回调的上下文:
(() => {
// `this` retains the context of its parent context
});