【问题标题】:Variables in setTimeout function don't work continuouslysetTimeout 函数中的变量不能连续工作
【发布时间】:2020-01-29 18:46:33
【问题描述】:

我的问题是,我的带有 SetTimeout 函数的循环确实有效,但我需要它每 50 毫秒从另一个变量中减去一个变量,但它只有效一次。这是我的代码:

<label for="customRange1">Weighting <output id="amount1" name="amount1" for="rangeInput1">100</output>%</label>
                        <input type="range" id="customRange1" name="rangeInput1" class="custom-range" min="0" max="100" value="100"
                               oninput="this.form.amount1.value=this.value">
<p id="display"></p>
 function input1(ev) {
     function1();
    var outputvalue1 = document.getElementById('amount1').value;
}
document.getElementById('customRange1').addEventListener('input', input1);



var weightingall = 100;
function function1(){
     var weighting1 = outputvalue1;
     var inputmax = weightingall - weighting1;
    document.getElementById("display").innerHTML = test5;
    setTimeout(function1, 50);
}

function1();

【问题讨论】:

  • 什么是test5,什么是outputvalue1,为什么inputmax从来没有读取?您的脚本中似乎缺少很多内容...

标签: javascript function variables settimeout


【解决方案1】:

如果您要进行间隔,则不应使用setTimeout,而应使用setInterval

setInterval 函数的工作方式与setTimeout 相同,它需要回调和毫秒数。它还返回一个区间对象,可用于在将区间传递给clearInterval 函数时停止区间。

您的代码无法正常工作,因为您从未更改 weightingall 的值。所以你每次都会得到相同的数量。

在这里,我已经生成了您的代码的工作原型。请注意,我删除了一些东西以使其正常工作。您不能简单地将其复制并粘贴到您的代码中,期望一切正常。

var weightingall = 100;
let interval = setInterval(() => {
  var weighting1 = 10;
  // we remove 10 each time.
  weightingall = weightingall - weighting1;
  document.getElementById("display").innerHTML = weightingall;
  // if the weightingall variable comes down to 0, we clear the interval.
  if(weightingall <= 0 ){
    clearInterval(interval);
  }
}, 1000);
&lt;div id="display"&gt;&lt;/div&gt;

请注意,我在这里使用了箭头函数和let 来解决范围问题。
You should always use let/const rather than var

【讨论】:

  • 在大多数情况下,setTimeoutsetInterval 更安全——即使你需要间隔——但这取决于用例。
  • @Ben 这是真的。我认为在这种情况下是安全的,但我们对 OP 的上下文了解不多,所以我可能是错的。
  • 谢谢,但是当我使用代码时,它在文本框中显示为 NaN... 我编辑了我的帖子以发布更多我正在使用的代码 抱歉,我在创建时忘记这样做我的帖子
  • @fafa_60_ 从我可以从您添加的代码中获得,您无法访问变量outputvalue1,因为它是在input1 函数中使用var 定义的。你应该阅读我提供的关于变量范围的链接。这可能是您的问题。
【解决方案2】:

这可能有帮助吗?

let counter = 100;

function countdown() {
    console.log(counter--)        
    if(counter >= 0) { setTimeout(countdown, 50) }
}
countdown()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多