gpt4 book ai didi

javascript - 从子 SetInterval 函数设置父变量

转载 作者:行者123 更新时间:2023-12-03 07:26:13 27 4
gpt4 key购买 nike

假设我有一组 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 中没有特殊含义(尽管在浏览器中有)。在您的超时函数中,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);
}

它所做的是在对 a 的调用中将名为 self 的变量设置为 this 的值。超时函数关闭self,所以可以使用self.meow

if I am referencing it wrong then why does this work

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

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

关于javascript - 从子 SetInterval 函数设置父变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13873681/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com