在我的Javascript代码中,我试图设置此代码
if(this.boolean == true) {
setTimeout(function(){ this.boolean = false; }, 2000);
}
但是由于某种原因它不起作用,布尔值仍然是正确的。如何解决此问题/该怎么办? setTimeout可与其他代码行一起使用,但奇怪的是,这行代码不是。
答案 0 :(得分:2)
alpha
在JavaScript中的行为举止特殊。
更改
this
到
setTimeout(function(){ this.boolean = false; }, 2000);
和setTimeout(() => { this.boolean = false; }, 2000);
关键字将被块范围解释。
答案 1 :(得分:1)
这是因为有“ this”的原因-您可以使用闭包来做到这一点:
var x = this;
var onTimeout = function(){
x.boolean = false;
}
if(this.boolean == true) {
setTimeout(onTimeout, 2000);
}
“此”不是您认为的setTimeout函数中的内容:
setTimeout and "this" in JavaScript
如果有可用的ES6,箭头函数会将其词法作用域用于this
var onTimeout = () => this.boolean = false;
setTimeout(onTimeout , 2000);
有关此内容的更多信息:
https://medium.com/tfogo/advantages-and-pitfalls-of-arrow-functions-a16f0835799e
答案 2 :(得分:0)
如果您不使用箭头功能,则this
变量将是setTimeout
中的变量,而不是您的主类,因为它的变量scope。
以下应解决此问题。
if(this.boolean == true) {
setTimeout(() => { this.boolean = false; }, 2000);
}
答案 3 :(得分:0)
函数具有自己的StoreTask
,因此函数内部的this
表示您正在尝试更改函数本身的属性布尔值。另一方面,如果使用箭头功能,则可以避免这种情况,因为箭头功能没有自己的this.boolean
。
this
答案 4 :(得分:0)
在函数setTimeout中,“ this”的范围已更改。
您可以像其他评论者所说的那样使用箭头功能。
或者,您可以设置一个这样的变量,然后在SetTimeout内部的函数中使用该变量。
var coolThis = this;
if(coolThis.boolean == true) {
setTimeout(function(){ coolThis.boolean = false; }, 2000);
}