Ранний выход из функции?

402

У меня есть функция:

function myfunction() {
  if (a == 'stop')  // How can I stop the function here?
}

Есть ли что-то вроде exit()в JavaScript?

Саймон
источник
4
Вы хотите остановить казнь или вернуться?
Кен Стрейс
@ Кен Стрейс, в чем разница? как я понимаю, если я сделаю возврат, он остановит выполнение? не так ли?
Саймон
3
Ну, вот в чем дело: использование возврата просто вернет контекст вызывающей функции. Если вам действительно нужна семантика выхода, которую вы хотите остановить выполнение, вы можете сделать что-то вроде этого: vikku.info/codesnippets/javascript/…
Кен
1
@Ken - та ссылка, которую вы предоставили, связана с остановкой выполнения forцикла. Даже тогда я понятия не имею, почему предложенный метод будет использоваться, когда вы можете просто позвонить break;. Чтобы использовать пример из статьи: if(i==5) break;Использование returnостановит выполнение функции, независимо от того, находитесь ли вы в forцикле.
user113716
Сим - Да, returnостановит выполнение функции, которая, кажется, то, что вы просили.
user113716

Ответы:

639

Вы можете просто использовать return.

function myfunction() {
     if(a == 'stop') 
         return;
}

Это отправит возвращаемое значение undefinedтому, что вызвало функцию.

var x = myfunction();

console.log( x );  // console shows undefined

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

return false;
return true;
return "some string";
return 12345;
user113716
источник
4
Я знаю, что это старый пост, и это обычная практика, НО я думаю, что это плохое решение. Если функция ПРЕДЛОЖЕНА для возврата значения, вы должны использовать return. Если вы просто слепо используете return, вы можете столкнуться с проблемами позже. Особенно, если вы начинаете связывать события, которые имеют возврат в них. Проверьте это сообщение для получения дополнительной информации: fuelyourcoding.com/jquery-events-stop-misusing-return-false
64
@dbme: функции в JavaScript всегда возвращаются. Оператор return является неявным, если он не был предоставлен. Возвращаемое значение по умолчанию - это undefinedто, что предоставляет мое основное решение. В статье, на которую вы ссылались, говорится о том, как делать return falseэто в обработчике событий jQuery. Это совершенно другая проблема. Это правильный способ выхода из функции JavaScript. Очевидно, что если вызывающая сторона полагается на возвращаемое значение, значение должно быть определено соответствующим образом.
user113716
3
... Неявное изменение будет if(a != 'stop') { /* run my code */ }таким, что код будет выполняться только тогда, когда aон не равен, 'stop'без предоставления явного return. Но возвращаемое значение идентично моему решению . В обоих случаях undefinedбудут возвращены.
user113716
3
Потрясающий ответ. Я не осознавал, что есть разница между возвратом неопределенного против ложного против другого значения. Я пытался найти окончательный ответ относительно этого поведения в течение последнего часа. Так можно ли с уверенностью сказать (повторить вашу точку зрения), что return - это 100% безопасный способ выхода из метода, даже если вызывающая сторона привязана к событиям и т. Д.?
@dbme: Ну, все зависит от того, что ожидает метод, вызывающий функцию. Если какая-то библиотека кода определяет систему событий, которая сломается, если она получит undefined(или не получит какое-то другое значение) в качестве возвращаемого значения, тогда вам нужно будет соответствовать спецификации этого API и вернуть правильное значение. Как правило, для системы обработки событий это будет undefinedпростой индикатор того, что обработчик завершен, и дальнейших инструкций нет. С jQuery, return false;имеет особое значение, давая инструкции, чтобы сделать preventDefaultи stopPropagation.
user113716
49

Видимо, вы можете сделать это:

function myFunction() {myFunction:{
    console.log('i get executed');
    break myFunction;
    console.log('i do not get executed');
}}

См. Блочные области с помощью использования метки: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label

Я пока не вижу никаких минусов. Но это не похоже на общее использование.

Получил этот ответ: JavaScript эквивалент PHP-кубика

CMCDragonkai
источник
Можно ли использовать это решение с модулем экспорта nodejs? когда я пытаюсь это сделать, я получаю сообщение об ошибке «не используется». exports.MyFunction = function (data) {myFunction: {break myFunction;}}
Юрий Алмейда,
20
function myfunction() {
     if(a == 'stop') 
         return false;
}

return false; гораздо лучше, чем просто return;

xlaok
источник
13
Почему falseлучше? Я бы сказал, что по умолчанию undefinedлучше в общем случае. В любом случае, вы правы, говоря, что часто лучше возвращать значимое значение.
Брэд Кох
Это зависит от программиста и зависит от варианта использования. Например, функция может что-то проверять, поэтому, если проверка не удалась, имеет смысл возвращать falseбольше, чем undefined.
Адам Макартур
18

Эта:

function myfunction()
{
     if (a == 'stop')  // How can I stop working of function here?
     {
         return;
     }
}
обкрадывать
источник
11

Используя немного другой подход, вы можете использовать try catchс оператором throw.

function name() {
    try {
        ...

        //get out of here
        if (a == 'stop')
            throw "exit";

        ...
    } catch (e) {
        // TODO: handle exception
    }
}
Родни Сальседо
источник
3

если вы ищете скрипт, чтобы избежать отправки формы при обнаружении некоторых ошибок, этот метод должен работать

function verifyData(){
     if (document.MyForm.FormInput.value.length == "") {
          alert("Write something!");
     }
     else {
          document.MyForm.submit();
     }
}

изменить тип кнопки « Отправить » на «кнопку»

<input value="Save" type="button" onClick="verifyData()">

надеюсь, это поможет.

Авал Истирджа
источник
2

Использование a returnостановит функцию и возврат undefinedили значение, указанное с помощью команды возврата.

function myfunction(){
    if(a=="stop"){
        //return undefined;
        return; /** Or return "Hello" or any other value */
    }
}
Seizefire
источник
1

Мне не нравится отвечать на вопросы, которые не являются реальным решением ...

... но когда я столкнулся с этой же проблемой, я сделал обходной путь ниже:

function doThis() {
  var err=0
  if (cond1) { alert('ret1'); err=1; }
  if (cond2) { alert('ret2'); err=1; }
  if (cond3) { alert('ret3'); err=1; }
  if (err < 1) {
    // do the rest (or have it skipped)
  }
}

Надеюсь, что это может быть полезно для всех.

Лео
источник
Duh. Это так просто, я никогда не думал об этом !! Довольно полезно избегать больших вложенных IF. Спасибо.
Дебби А
Это было бы лучше с выключателем.
19
Зависит от того, хотите ли вы получать все оповещения об ошибках одновременно, или получать уведомление только об одном. Однако каждое условие должно быть выполнено в любом случае.
Лев
0

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

validateMaxNumber: function(length) {
   if (5 >= length) {
        // Continue execution
   }
   // Flash error message and stop execution
   // Can't stop execution by return or return false statement; 
   let message = "No more than " + this.maxNumber + " File is allowed";
   throw new Error(message);
}

Но я вызываю эту функцию из основной функции потока как

  handleFilesUpload() {
      let files =  document.getElementById("myFile").files;
      this.validateMaxNumber(files.length);
}

В приведенном выше примере я не могу остановить выполнение, если я не сгенерирую новый Error.Just return или return false работает, только если вы находитесь в основной функции выполнения, иначе это не работает.

Бедрам таманг
источник
-3

Выход(); можно использовать для перехода к следующей проверке.

Чираг Динешбхай Понда
источник
-4

Если вы используете JQuery. Это должно остановить пузырек функции до, так что родительская функция, вызывающая это, должна также остановиться.

  function myfunction(e)
  {
       e.stopImmediatePropagation();
       ................
  }
silvster27
источник
6
stopImmediatePropagation()это не jQuery, и прекращение распространения - это не то же самое, что выход из функции.
Брэд Кох
-13

введите любую случайную команду, которая выдает ошибку, например:

exit

или

die:-)
amrali
источник
Это может остановить выполнение всего кода, а не только остальной части функции. Проверьте скрипку: jsfiddle.net/b3k0xo7n/1
treecon
1
Какой ужасный подход к программированию. Как это интуитивно понятно для другого разработчика, который работает на той же кодовой базе?
osullic