假设我有一组看起来像这样的js:
function a() {
this.meow = 0;
var go = setTimeout(function() {
this.parent.meow++;
}, 500);
}
var woof = new a();
为什么woof.meow
不会递增,如果我引用错误,那么为什么会这样做:
(function() {
this.meow = 'woof';
var go = setTimeout(function() {
alert(this.parent.meow);
},500);
return true;
})();
甚至更令人困惑的是,为什么这不起作用:
(function() {
this.meow = 0;
var go = setTimeout(function() {
alert(this.parent.meow++);
},500);
return true;
})();
答案 0 :(得分:5)
parent
在JavaScript中没有特殊含义(尽管它在浏览器上有用)。在超时函数中,this
未引用您的a
实例,它引用window
对象。碰巧window
对象有一个名为parent
的属性,但该父级可能没有名为meow
的属性。您的超时函数中this
为window
的原因是,在JavaScript中,this
完全由函数调用的方式定义,而不是定义它们的位置。请参阅以下链接。
由于你的超时函数是对new a
调用的上下文的闭包,你可以这样做:
function a() {
var self = this;
this.meow = 0;
var go = setTimeout(function() {
self.meow++;
}, 500);
}
这样做是在self
的调用中将名为this
的变量设置为a
的值。超时功能关闭self
,因此可以使用self.meow
。
如果我错误地引用它,那为什么会这样做
您引用的代码不工作(live example),但我怀疑您看到了类似的内容,因为在该代码中,this
引用了window
对象,并且很容易最终调用一个函数,this
引用window
。所以meow
wold最终成为一个全局变量(你放在window
上的所有属性都是全局变量)。
关于闭包的更多信息和this
(在我的博客上):
答案 1 :(得分:0)
T.J。克劳德是对的,另类:
function a() {
var meow = 0;
var go = setTimeout(function() {
meow++;
}, 500);
}