【问题标题】:Javascript - loop inside a loopJavascript - 在循环内循环
【发布时间】:2016-02-04 17:25:51
【问题描述】:

我有以下代码:

 for (i = 0; i < 3; i++){ //big loop
    console.log("Start of round" + i)
    for (s = 0; s < 5000; s++){ //small loop aka delay loop
        console.log("End of round" + i);
    }
    s = 0; //reset

}

首先,我知道还有其他方法可以解决这个问题。问题是,我正在尝试进一步了解循环,所以我选择了这个例子,请告诉我哪里错了。

所以我有一个应该自己运行 3 次的循环。每次它自己运行时,都会有一个循环来延迟进程。 问题是,延迟在第 2 次和第 3 次停止发生。

这是我认为应该发生的事情

1) 首先 i = 0,继续循环

2)延迟进一步进行内部循环

3)当延迟循环结束时,重新设置小循环的s var,这样当i = 1时它会再次运行;更大的循环将重新开始

4) 当 i = 1 时,大循环再次开始;所以继续,再次运行延迟循环,因为我们上次重置了 var s。

5) 当 i = 2 时重复

我在这里缺少什么?我想更深入地了解 javascript 循环。谢谢。

【问题讨论】:

  • 循环不会造成延迟...如果您想要明显的时间延迟,那么您使用了错误的技术。
  • 嵌套循环不会产生延迟,只会降低性能
  • 你不需要重置s = 0,它会在每次主迭代中发生
  • 延迟可以使用setTimeout,见相关讨论here
  • 另外console.log("End of round" + i); 应该是你外循环的最后一行

标签: javascript loops variables for-loop


【解决方案1】:

延迟并没有真正的区别,您所看到的只是控制台在 for 循环中努力快速更新。

for (i = 0; i < 3; i++){ //big loop
    console.log("Start of round" + i);
    console.time(i);
    for (s = 0; s < 5000; s++){ //small loop aka delay loop
        console.log("End of round" + i);
    }
    console.timeEnd(i);

}

当您记录处理时间时,您会看到数字几乎相同。

如果删除日志行,您可以更清楚地看到循环是相同的 +- 毫秒

for (i = 0; i < 3; i++){ //big loop
    console.log("Start of round" + i);
    console.time(i);
    for (s = 0; s < 5000; s++){ //small loop aka delay loop
    }
    console.timeEnd(i);

}

浏览器会优化代码,因为作为开发人员和用户,您想要更快的代码。

如果你真的想要延迟,你需要使用 setTimeout 或 setInteral

var count = 0;
function round () {
    console.log(count);
    count++;
    if(count<3) {
        window.setTimeout(round, 2000);
    }
}
round();

【讨论】:

  • 是的,我刚刚意识到这一点。该循环飞得太快,所有控制台日志都在心跳内结束。
【解决方案2】:

首先,您不需要使用循环作为延迟,而是可以使用:

setTimeout(functionReference, timeOutMillis);

第二:你不需要重新设置 s。当您进入第二个循环时,它将自动设置为 0。

【讨论】:

  • 我已经知道 setTimeout - 这是我尝试循环选项后的第二次尝试。不过 - 我很好奇为什么延迟只发生了一次,而不是接下来的 2 次。
  • 因为处理代码的速度不是恒定的。
  • RE 第二:由于没有使用var,所以变量是全局的。因此重置。
【解决方案3】:

我认为您这样做是因为在 JavaScript 中不存在线程,您的代码实际上可以在我的浏览器上运行,因为 for 语句会为您完成,所以您不需要 s=0;

for (i = 0; i < 3; i++){ //big loop
    console.log("Start of round" + i)
    for (s = 0; s < 5000; s++){ //small loop aka delay loop
        console.log("End of round" + i);
    }

}

您可以使用 setTimeout 函数,而不是使用该延迟:

setTimeout(function, timeInMilliseconds);

并将您的日志放入一个函数并运行它,这是一种使用“线程”而不是“线程”的方法(因为与一个函数不一样)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 2014-06-18
    • 2018-04-15
    • 2015-04-10
    • 2013-03-03
    相关资源
    最近更新 更多