Есть ли петля "начало-заново"? - PullRequest
13 голосов
/ 07 января 2012
  • Существует continue; для остановки цикла и перехода к следующему циклу
  • Существует break; для остановки цикла и перехода к концу цикла

Не существует ли какой-нибудь start;, который останавливает цикл и движется к началу цикла?

Я знаю, что легко выполнить все эти три действия, просто изменив значение i, но я всегда стараюсь искать уже встроенные функции.

Ответы [ 6 ]

12 голосов
/ 07 января 2012

Нет - нет ключевого слова или другого способа сделать это автоматически.

Как вы уже упоминали, вы можете просто изменить переменную (и) условия цикла в вашем цикле.Это просто, если это простой 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, вы можете легко поместить его непосредственно перед циклом for внутри while, и все это будет перезапущено ...

11 голосов
/ 07 января 2012

Сброс значения вашей переменной цикла к начальному значению с последующим вызовом continue настолько близок, насколько вы получите.

Например:

for(var i=0; i<20; i++) {
  if(somecondition) {
    i=-1; continue;
  }
}
4 голосов
/ 07 января 2012

Если вы хотите избежать переходов или эквивалентов операторов 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
}
3 голосов
/ 07 января 2012

Нет.(Просто чтобы исключить «я просто не слышал об этом, либо» - это не упоминается в https://developer.mozilla.org/en/JavaScript/Reference/Statements.)

2 голосов
/ 07 января 2012

continue работает, просто пропуская остальную часть тела цикла.break работает, пропуская остальную часть тела цикла и затем заканчивая цикл.Функция start должна каким-то образом «перематывать» состояние программы, но не все состояние программы, поскольку, по-видимому, вы также не хотите потерять то, что делали, - туда, где оно было во время цикла.начал, что не является тем, что обеспечивает любой язык программирования, который я видел.

1 голос
/ 07 января 2012

Вы можете иметь цикл в функции, которая вызывает себя рекурсивно:

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

Очевидно, что вы можете изменить условия так, чтобы они соответствовали вашей логике, как показано выше - простой пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...