【问题标题】:Confused about SetInterval and closures对 SetInterval 和闭包感到困惑
【发布时间】:2017-02-28 08:48:00
【问题描述】:

如何使用 setInterval 重复更新 div 的内容

我使用此链接中的问题作为参考How to repeatedly update the contents of a <div> by only using JavaScript?

但我这里有几个问题

  1. 我们可以在没有匿名函数的情况下使用闭包来实现吗?我已经尝试过,但最终无法找到任何可行的解决方案。
  2. 我们如何让它无限运行,使用以下代码,一旦我达到 10,它就会停止。

window.onload = function() {
  var timing = document.getElementById("timer");
  var i = 0;
  var interval = setInterval(function() {
    timing.innerHTML = i++;
    if (i > 10) {
      clearInterval(interval);
      i = 0;
      return;
    }
  }, 1000);
}
&lt;div id="timer"&gt;&lt;/div&gt;

我对 setIntervals 和闭包感到困惑 有人可以帮我吗

谢谢

【问题讨论】:

  • "使用以下代码,一旦我达到 10,它就会停止" --- 因为您使用 clearInterval 明确停止它。如果你不想阻止它 - 只是不要
  • 不知道为什么这里有反对票。老实说,我对 setIntervals 感到困惑

标签: javascript html closures setinterval


【解决方案1】:

你可以用闭包做这样的事情。只需重置您的 i 值,您将始终在您的给定范围内。

window.onload = function() {

  var updateContent = (function(idx) {

    return function() {

      if (idx === 10) {
        idx = 0;
      }

      var timing = document.getElementById("timer");
      timing.innerHTML = idx++;
    }
  })(0);

  var interval = setInterval(updateContent, 1000);

}
&lt;div id="timer"&gt;&lt;/div&gt;

【讨论】:

  • 我认为您将“关闭”与“IIFE”混淆了。我在这里看不到后者的理由。另外,如果您要费尽心思使用 IIFE,为什么每次都通过循环检索 DOM 元素?
【解决方案2】:

这个应该比较清楚。

function updateTimer() {
  var timer = document.getElementById("timer");
  var timerValue = parseInt(timer.getAttribute("data-timer-value")) + 1;
  if (timerValue == 10) {
    timerValue = 0;
  }
  timer.setAttribute("data-timer-value", timerValue);
  timer.innerHTML = "the time is " + timerValue;
}
window.onload = function() {
  setInterval(updateTimer, 1000);
}
&lt;div id="timer" data-timer-value="0"&gt;&lt;/div&gt;

【讨论】:

  • 这种方法的唯一问题是变量可以随时从属性中修改,它不再按预期工作。此外,它不涉及 OP 要求的闭包。
  • @Eric..感谢您的解决方案。我希望它连续显示 0 到 9。这里它正在递增
  • 我编辑了代码示例,现在它从 0 到 9 一遍又一遍
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2011-12-31
  • 2021-11-28
相关资源
最近更新 更多