Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从子SetInterval函数设置父变量_Javascript - Fatal编程技术网

Javascript 从子SetInterval函数设置父变量

Javascript 从子SetInterval函数设置父变量,javascript,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(fun

假设我有一组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; 
})();

parent
在JavaScript中没有特殊意义(尽管在浏览器上有)。在超时函数中,
不是指
实例,而是指
窗口
对象。碰巧
窗口
对象有一个名为
父对象
的属性,但该父对象可能没有一个名为
喵喵
的属性。之所以
这个
是超时函数中的
窗口
,是因为在JavaScript中,
这个
完全是由函数的调用方式定义的,而不是定义在什么地方。请参阅下面的链接

由于超时函数是对
newa
调用上下文的闭包,因此可以执行以下操作:

function a() {
var self = this;

this.meow = 0;
    var go = setTimeout(function() {
        self.meow++;
    }, 500);
}
这样做的目的是在对
a
的调用中,将名为
self
的变量设置为
this
的值。超时功能关闭
self
,因此可以使用
self.meow

如果我引用的是错误的,那么为什么这是有效的呢

您引用的代码不起作用(),但我怀疑您看到了类似的情况,因为在该代码中,
this
引用了
window
对象,并且很容易调用这样的函数,
this
引用了
window
。所以
meow
wold最终成为了一个全局变量(您在
window
上放置的所有属性都是全局变量)

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


T.J.Crowder是对的,备选方案:

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

哦,好吧,那为什么我能引用
.parent.meow
呢?好的!好吧,抱歉,这有点愚蠢,我完全忘记了变量被设置为
window
haha-oops“如果我引用错误,那么这为什么有效”它不起作用:在这种情况下,a()将仍然是构造函数,但meow将只是一个私有变量,而不是一个公共变量…就像我说的,meow将是一个私有变量,如果希望它是公共的,可以在构造函数的末尾返回它,即
函数a(){var meow=0;返回{meow:meow};}var b=new a();警惕(b.meow)