Javascript 从子SetInterval函数设置父变量
假设我有一组js,如下所示: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
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)代码>