Выполнить блок else из блока if

#javascript

#javascript

Вопрос:

В JavaScript есть ли способ перейти к блоку else из блока if?

Вот пример:

 if (is_valid) {
  some code;

  if (!something_else_is_valid) {
    // Skip to else to handle error;
  }
} else {
  handle_error_here;
}
  

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

Спасибо за ваши ответы / комментарии!

Ответ №1:

Никогда не говори никогда: Да — и они возненавидят тебя за это, но эй:

 var else_ = false
var if_ = true

IF: 
{
 if(if_){
    console.log("entered IF BLOCK")
    var second = false
    if(!second){
      console.log("exits to ELSE BLOCK")
      else_ = true
      break IF;
      console.log("this will not be executed - its skipped")
    }
 }
}
ELSE: {
  if(!else_) break ELSE;
  console.log("entered ELSE BLOCK")
  
}  

соответствующим образом пометьте свои блоки, и вы сможете выйти из блока if в блок else 😉

Ответ №2:

В JavaScript есть ли способ перейти к блоку else из блока if?

Нет, потому что условие уже достигнуто, поэтому невозможно вернуться назад и ввести else условие.

Вы можете использовать инструкцию switch . break Ключевое слово останавливает последующее выполнение. Если something_else_is_valid равно false, то break не произойдет, поэтому switch блок достигнет default случая, который является «случаем ошибки».

 function A(is_valid, something_else_is_valid) {
  switch(is_valid) {
    case true: 
      // some code
      if (something_else_is_valid) {
        // do somthing
        break;
      } // else, will reach default case.
    default:
      throw new Error("Wrong!");
      // handle_error_here
  }
}

A(true, false);  

Ответ №3:

Нет, после того, как if введено, нет возможности выполнить обратный переход, хотя вы могли бы рекурсивно вызвать содержащую функцию с помощью is_valid of false :

 function doTest(is_valid) {
  if (is_valid) {
    // some code;

    if (!something_else_is_valid) {
      return doTest(false);
    }
  } else {
    // handle_error_here;
  }
}
  

Вы также могли бы использовать try/catch (хотя, в идеале, исключения являются исключительными, а не конструкцией потока управления):

 try {
  if (!is_valid) {
    throw new Error();
  }
  // some code;
  if (!something_else_is_valid) {
    throw new Error();
  }
} catch(e) {
  // handle_error_here;
}
  

Еще лучше, чем оба, было бы обрабатывать ошибки в одной функции, которую вы можете вызвать, но вы сказали, что не хотите этого делать.

Ответ №4:

Нет, вы не можете — вы должны комбинировать условия:

 if (is_valid amp;amp; something_else_is_valid) {
    //Some code
} else {
    handle_error_here();
}
  

Комментарии:

1. Я не хочу этого делать, потому что мне нужен некоторый код для запуска в блоке if перед тем, как я выполню оценку something_else_is_valid .

2. Затем вы должны вложить else .