如何调查为什么setTimeout函数在我的代码中不起作用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何调查为什么setTimeout函数在我的代码中不起作用?相关的知识,希望对你有一定的参考价值。

我的代码工作,所有值都是true,因此它应该运行,但它不会。

我试过本地化变量,改变时间,重新排列函数和名称标签。

auto1();  
var autocount = 0;
var autotrue = 0;

function auto1(){
    setTimeout(function() {
      while(autotrue==1){
        money = money + autocount;
        setText("money_display",money);
      }
    }, 1000);

    onEvent("auto1", "click", function(){
      if(money >= 10){autotrue = 1;
        money = money - 10;
        autocount = autocount+1;
        console.log("You now have " + autocount + " J$ per second");
      } else {
        console.log("you have insufficient J$ for this purchase");
      }
    });
}

我希望每1000毫秒我的钱变量加1。但它对货币变量没有任何作用

答案

您的代码存在几个问题:

  1. money变量未定义
  2. 计时器内的while循环会使浏览器冻结
  3. timeout应该是interval而不是
  4. autotrue应该是一个布尔值

为了一个有效的例子,我伪造了setText()函数并将onEvent()更改为addEventListener()

auto1();

var autocount = 0;
var autotrue = false;
var money = 10;

function auto1() {
  autoAddInterval = setInterval(function() {
    if (autotrue) {
      money = money + autocount;
      setText("money_display", money);
    }
  }, 1000);
  document.getElementById('auto1').addEventListener("click", function() {
    if (money >= 10) {
      autotrue = true;
      money = money - 10;
      autocount = autocount + 1;
      console.log("You now have " + autocount + " J$ per second");
    } else {
      console.log("you have insufficient J$ for this purchase");
    }
  });
}

function setText(id, value) {
  document.getElementById(id).innerText = value + ' J$';
}

setText("money_display", money);
balance: <span id="money_display">0 J$</span><br>
<button id="auto1">purchase +1 J$ per second</button>
另一答案

这里有一些问题:

setTimeout只运行一次,在1000毫秒结束时。在这种情况下,当它运行时,你将进入无限循环,因为autotrue永远不会被设置为true。它仍然是0,你将它添加到金钱和金钱永远不会超过10,因为0 + 0 = 0。

如果你想每1000毫秒重复加钱,你会使用setInterval,里面没有任何循环。这会每隔1000毫秒就会调用你的函数。

另一答案

你在变量auto1autocount被初始化为0之前调用autotrue,因此它们仍然是undefined并且会破坏你的计算。您应该在初始化所有变量后调用该函数。

另外while(autotrue==1){看起来好像是无限的,因为没有什么改变autotrue。无限循环总是坏的。

另一答案

拿出来,你会看到计时器工作。

  while(autotrue==1){
    money = money + autocount;
    setText("money_display",money);

您的问题是您没有将autotrue var设置为1。

以上是关于如何调查为什么setTimeout函数在我的代码中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

如何知道哪些事件减慢了setTimeout?

Font Awesome setTimeout函数无法动画(Javascript)

setTimeout 和匿名函数问题

单击停止后执行我的setTimeout函数

setTimeout 函数执行代码没有任何延迟。 Javascript [重复]

如何使用CoffeeScript重新同步setTimeout()? Rails 5