从Child SetInterval函数设置父变量

时间:2012-12-14 06:20:15

标签: javascript

假设我有一组看起来像这样的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; 
})();

2 个答案:

答案 0 :(得分:5)

parent在JavaScript中没有特殊含义(尽管它在浏览器上有用)。在超时函数中,this未引用您的a实例,它引用window对象。碰巧window对象有一个名为parent的属性,但该父级可能没有名为meow的属性。您的超时函数中thiswindow的原因是,在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);
}