无法使用setTimeout撤消布尔值

时间:2020-02-14 16:45:25

标签: javascript

在我的Javascript代码中,我试图设置此代码

    if(this.boolean == true) {
        setTimeout(function(){ this.boolean = false; }, 2000);

    }

但是由于某种原因它不起作用,布尔值仍然是正确的。如何解决此问题/该怎么办? setTimeout可与其他代码行一起使用,但奇怪的是,这行代码不是。

5 个答案:

答案 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);
}