从Child SetInterval函数设置父变量

Mic*_*ets 1 javascript

假设我有一组看起来像这样的js:

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

var woof = new a();
Run Code Online (Sandbox Code Playgroud)

为什么不woof.meow增加,如果我引用它错了那么为什么这样做:

(function() { 
   this.meow = 'woof'; 
   var go = setTimeout(function() {
      alert(this.parent.meow); 
   },500); 
   return true; 
})();
Run Code Online (Sandbox Code Playgroud)

甚至更令人困惑的是,为什么这不起作用:

(function() { 
   this.meow = 0; 
   var go = setTimeout(function() {
      alert(this.parent.meow++); 
   },500); 
   return true; 
})();
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 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);
}
Run Code Online (Sandbox Code Playgroud)

什么是不设置一个叫做变量self,它的值this调用内a.超时功能关闭self,因此可以使用self.meow.

如果我引用它错了那么为什么这样做

你引用的代码工作(活生生的例子),但我怀疑你看到类似的东西给它的代码,因为工作,this引用window的对象,这是很容易落得调用一个函数,使得this引用window.因此,meowwold最终成为一个全局变量(你输入的所有属性window都是全局变量).

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