2

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

2 回答 2

5

parent在 JavaScript 中没有特殊含义(尽管它在浏览器中具有)。在您的超时函数中,this不是指您的a实例,而是指window对象。碰巧该window对象有一个名为 的属性parent,但该父对象可能没有一个名为 的属性meow。原因this在于window您的超时函数是在 JavaScript 中,this完全由函数的调用方式定义,而不是在哪里定义它们。请参阅下面的链接。

由于您的 timeout 函数是对调用上下文的闭包new a,因此您可以这样做:

function a() {
var self = this;

this.meow = 0;
    var go = setTimeout(function() {
        self.meow++;
    }, 500);
}

所做的是将调用的变量设置为调用中self的值。超时功能关闭,因此可以使用.thisaselfself.meow

如果我引用错了那为什么这行得通

您引用的代码不起作用现场示例),但我怀疑您看到了与它类似的东西,因为在该代码中,this引用了window对象,并且很容易最终调用this引用的函数window。所以meowwold 最终成为一个全局变量(您放置的所有属性window都是全局变量)。

更多关于闭包和this(在我的博客上):

于 2012-12-14T06:26:44.770 回答
0

TJ Crowder 是对的,替代方案:

function a() {
    var meow = 0;
    var go = setTimeout(function() {
        meow++;
    }, 500);
}
于 2012-12-14T06:29:17.317 回答