【问题标题】:Is there a loop "start-over"?是否有循环“重新开始”?
【发布时间】:2012-02-04 17:14:09
【问题描述】:
  • continue; 停止循环并移动到下一个循环
  • break;停止循环并移动到循环的end

难道没有某种start; 可以停止循环并移动到循环的开始

我知道只需修改i 的值即可轻松实现所有这三个操作,但我总是尝试寻找已经内置的功能。

【问题讨论】:

  • 您可以通过像在 for 循环中一样将计数器重置为 0 来重新启动循环,它将重新启动

标签: javascript loops


【解决方案1】:

将循环变量的值重置为初始值,然后调用 continue 就很接近了。

例如:

for(var i=0; i<20; i++) {
  if(somecondition) {
    i=-1; continue;
  }
}

【讨论】:

  • 我相信i=-1 更合适(我可能是错的),这取决于continue 是否阻止i++(我不知道)
  • @ajax333221 是正确的。 continue 在重新评估条件之前肯定会跳转到更新表达式。
  • 不用测试,the doco这么明确的说...
  • 我能问一下我们为什么不做i = 0 吗?
  • @jason 因为i++ 会再恢复一次。 -1 表示 i++ 将按预期将您重置为 0
【解决方案2】:

否 - 没有关键字或其他方式可以自动完成。

正如您已经提到的,您可以在循环中修改循环条件变量。如果它是一个简单的 i 计数器,这很容易,但当然,您可能需要做的不仅仅是一个简单的计数器。

或者您可以执行以下操作:

restartLoop:
while (true) {
   for (var i=0, j=100000, x="test"; i < 1000; i++, j--, x+= ".") {
      if (/*some condition, want to restart the loop*/)
          continue restartLoop;
   }
   break;
}

continue restartLoop 将跳回以继续 while 循环的下一次迭代,然后立即从开头开始 for 循环,包括所有初始化代码。如果for 正常退出,break 语句之后会跳出包含的while循环。

我真的不建议在一般意义上这样做,但如果你的循环初始化过程真的很复杂,那可能是值得的,因为这样你就不需要在环形。如果您需要进行比for 语句的初始化表达式更合适的初始化,您可以轻松地将其放在while 内的for 循环之前,它将全部重新运行...

【讨论】:

  • 是的,continuebreak 都可以与label 一起使用,这样您就可以从内部循环内部使用continuebreak 外部循环(通过尽可能多的级别根据需要嵌套)。当然,在我的回答中,我稍微滥用了这一点,因为我的外循环除了允许重新启动内循环之外没有任何目的,但无论如何,我相信你可以想象到还有更严肃的应用程序。跨度>
  • 是否可以标记循环的开头,并使用 break 跳转到它? (是这样吗,我想我找到了一个有趣的方法来实现我想要的)
  • 不,break somelabel 将退出somelabel 适用的循环并继续循环后的语句。这就是为什么我在答案中使用了 continue 和包含循环的原因。您正在寻找的是 goto,这是 JavaScript 所没有的 - 谢天谢地。 (Unless you use this add-on.)
  • +1 让我们了解这个深奥的 JS 功能。 (Use with caution)
  • 我以前使用过意大利面条代码。我尽可能避免在现代语言中使用它。我实际上认为返回技巧是最好的解决方案。重置i 也不是很好。
【解决方案3】:

如果您想避免跳转或我们许多人受过训练要避免的类似 goto 语句,您可以使用本地函数进行循环并测试返回值,看看是否应该再次调用它:

function doItAll() {
    // put state variables other than the actual loop control here

    function doTheLoop() {
        for(var i=0; i<20; i++) {
            if (somecondition) {
                return(true);    // run the loop again
            }
        }
        return(false);   // done running the loop
    }
    while (doTheLoop()) {}
    // do some things after the loop
}

【讨论】:

  • 这是一个很好的解决方案。然而,您可以通过将 while 和 for 放入同一个函数来美化和增强它。
【解决方案4】:

没有。 (只是为了排除“我也没有听说过”——https://developer.mozilla.org/en/JavaScript/Reference/Statements 没有提到它。)

【讨论】:

    【解决方案5】:

    continue 通过简单地跳过循环体的其余部分来工作。 break 通过跳过循环体的其余部分然后结束循环来工作。 start 函数必须以某种方式“倒带”程序的状态——但不是程序的所有状态,因为大概你也不想失去你所做的事情——回到循环时的位置开始了,这不是我见过的任何编程语言都提供的。

    【讨论】:

    • 我怀疑数据会丢失,如果您从 0 开始循环并且在某些循环之后分配值 -1 它将再次开始循环。我经常用这个。
    • 是的 - 但要自动执行此操作,语言需要知道循环变量是哪一个。
    【解决方案6】:

    您可以在递归调用自身的函数中使用循环:

    function loopIt(numTimes) {
                if (numTimes < 3) {
                    for (x = 0; x < 20; x++) {
                        if (x == 5) {
                            loopIt(numTimes+1);
                            break;
                        }
                    }
                }     
            }
    

    您显然可以更改条件以适应您的逻辑,因为上面是一个简单的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 2012-02-11
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多