Ключевое слово break в Javascript предназначено только для выхода из циклов? - PullRequest
5 голосов
/ 09 февраля 2012

Один из моих друзей преподает урок программирования на Javascript, и одним из его заданий было создание игры по угадыванию чисел. Это был его пример реализации:

funProgram: for(;;) {
  numberGuesser: {
    var num = (Math.random() * 100) | 0;
    var guess = +prompt("I'm thinking of a number between 0 and 100. Try to guess it.", 0);
    var guesses = 1;
    guess: for(;;) {
      higher: {
        lower: {
          if(guess === num) break guess;
          if(guess > num) break lower;
          guess = +prompt("Too low. Try again.", 0);
          break higher;
        }
        guess = +prompt("Too high. Try again.", 0);
      }
      guesses++;
    }
    alert("You got it in " + guesses + " guesses! The number is " + num);
  }
  var again = prompt("Do you want to guess again (y/n)?", "y") === "y";
  if(!again) break funProgram;
}

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

Я уже давно использую Javascript, и здесь есть несколько вещей, которые я никогда раньше не видел, и некоторые вещи, которые я до сих пор не понимаю. Я думал, что ключевое слово break специально предназначено для выхода из циклов. Блоки higher и lower не являются петлями, но, очевидно, вы все еще можете выйти из них. Как это возможно? Мне кажется странным вырваться из чего-то, что не зацикливается. Можете ли вы также выйти из функций, используя ключевое слово break?

Ответы [ 4 ]

3 голосов
/ 09 февраля 2012

Перерывы могут фактически иметь метки (и принимать их).Тем не менее, я не уверен, кто такой «Он», но я бы зашел так далеко, чтобы сказать, что «Он» передает его идеалы программирования, а не конкретный стандарт.То есть, нет необходимости использовать ярлыки, это просто делает его более разборчивым для конкретного человека.(И, ИМХО, ярлыки напоминают дни ОСНОВНОГО / ГОТОГО, которые обычно приводят к Коду спагетти ).

Дополнительный кредит: Спросите своего друга, если он писал в БЕЙСИК;Могу поспорить, что вы получите «да» (наряду с множеством вредных привычек на протяжении курса - это не относится к профилю, у меня просто никогда не было хорошего опыта работы с программистами на BASIC / VB после [текущего]] шаблоны кодирования))

Команда break обычно используется для выхода из циклов, однако, если кодовый блок вложен в метку, вы создаете еще один блок, из которого вы можете разбить.Это также дает вам больше гибкости в отношении того, откуда должен выходить перерыв.Например:

for (;;){ // "for a"
  for(;;){ // "for b"
    break; // breaks "for b"
  }
}

В этом случае break предназначен только для выхода из вложенного («для b») цикла.Однако:

myblock: {
  for(;;){
    for(;;){
      break mybock; // breaks label "myblock"
    }
  }
}

В этом случае break фактически выходит из обоих циклов, потому что вы указываете ему полностью выйти из блока меток.Это было бы почти как:

function myblock(){
  for(;;){
    for(;;){
      return; // exits function "myblock"
    }
  }
}

Где return выходит из блока, аналогично тому, как действует break myblock.


Кстати, не зря, янайти это немного легче читать:

var again = true;
while (again){
    var num = (new Date()).getMilliseconds() % 100,
        guess = +prompt("I'm thinking of a number between 0 and 100. Try to guess it.", "1"),
        guesses = 1;
    while (num !== guess){
        guesses++;
        guess = +prompt((guess < num ? "Too low." : "Too high.") + " Try again.", guess);
    }
    alert("You got it in " + guesses + " guesses! The number is " + num);
    again = prompt("Do you want to guess again? (y/n)", "y") == "y";
}
1 голос
/ 09 февраля 2012

Я могу понять код после небольшого исследования label и break в javascript. Однако мне лично не нравится этот стиль кодирования, в основном потому, что помеченный синтаксис block слишком похож на буквальную нотацию объекта - которую я использую много . И даже документация Mozilla на этикетках говорит нам избегать их:

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

Относительно ваших объективных вопросов:

  1. break может использоваться для выхода из операторов for, while и case, а также с пометкой blocks.

  2. Вы не можете использовать break для выхода из функции, вы должны использовать return.

0 голосов
/ 09 февраля 2012

Эти break операторы используются так же, как goto используется в старых языках. И как указала Акула: вы также можете использовать их в выражениях switch, но не в функциях.

Возможно, вас смущает, потому что он использует помеченные блоки в сочетании с бесконечными for(;;) циклами.

Посмотрите эту статью здесь для получения дополнительной информации: http://james.padolsey.com/javascript/labelled-blocks-useful/

0 голосов
/ 09 февраля 2012

От MDN (жирный ударение):

Оператор break включает дополнительную метку, которая позволяет программе вырваться из помеченного заявления. break заявление должно быть вложенный в это помеченное утверждение. Помеченное утверждение может быть любой оператор block ; этому не должен предшествовать цикл утверждение.

Итак, да, метки можно использовать вне циклов, но нет, их нельзя использовать для возврата из функции.

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