Достроковий вихід з функції?


402

У мене є функція:

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

Чи є щось на кшталт exit()JavaScript?


4
Ви хочете зупинити виконання чи повернути його?
Ken Struys

@Ken Struys в чому різниця? як я розумію, якщо я поверну, це зупиняє виконання? чи не так?
Саймон

3
Ну ось у чому річ, використання повернення просто повернеться до контексту функції виклику. Якщо ви дійсно хочете, щоб випускний семантичний ви хочете зупинити виконання, ви можете зробити щось подібне: vikku.info/codesnippets/javascript/…
Кен Стрейс

1
@Ken - Це посилання, яке ви надали, стосується зупинки виконання forциклу. Навіть тоді я не маю уявлення, для чого пропонується запропонований метод, коли можна просто зателефонувати break;. Для використання прикладу зі статті: if(i==5) break;Використання returnзупинить виконання функції, незалежно від того, знаходитесь ви в forциклі.
користувач113716

Syom - Так, returnзупинить виконання функції, що, здається, те, про що ви просили.
користувач113716

Відповіді:


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;

4
Я знаю, що це старий пост, і це звичайна практика, Але я думаю, що це погане рішення. Якщо функція ПОДАЄТЬСЯ для повернення значення, слід використовувати return. Якщо ви просто сліпо скористаєтеся функцією return, згодом у вас можуть виникнути проблеми. Особливо, якщо ви починаєте обов'язкові події, які мають в них прибуток. Перегляньте цю публікацію для отримання додаткової інформації: fuelyourcoding.com/jquery-events-stop-misusing-return-false

64
@dbme: Функції JavaScript завжди повертаються. Заява повернення неявна, якщо вона не була надана. Повернене значення за замовчуванням - це undefinedте, що забезпечує моє основне рішення. У статті, на яку ви посилаєтесь, йдеться про те, як робити return falseв обробці подій jQuery. Це зовсім інше питання. Це правильний спосіб виходу з функції JavaScript. Очевидно, якщо абонент покладається на повернене значення, значення потрібно визначити відповідним чином.
користувач113716

3
... Неявна варіація буде if(a != 'stop') { /* run my code */ }такою, що код запускається лише тоді, коли aвін не дорівнює, 'stop'не надаючи явного return. Але повернене значення ідентичне моєму рішення . В обох випадках undefinedбуде повернуто.
користувач113716

3
Дивовижна відповідь. Я не розумів, що існує якась різниця між поверненням невизначеного проти хибного проти іншого значення. Я намагався знайти остаточну відповідь щодо такої поведінки протягом останньої години. Тож чи безпечно сказати (повторити свою точку), що повернення - це 100% безпечний спосіб вийти з методу, навіть якщо абонент пов'язаний з подіями тощо?

@dbme: Ну, все залежить від того, що очікує метод виклику функції. Якщо деяка бібліотека коду визначає систему подій, яка порушиться, якщо вона отримає undefined(або не отримає якесь інше значення) як повернене значення, тоді вам потрібно буде відповідати специфікації цього API та повернути правильне значення. Як правило, для системи обробки подій це буде очікувати undefinedяк простий показник того, що обробник закінчив, і подальших інструкцій немає. У jQuery return false;має особливе значення, даючи вказівку робити a preventDefaultі stopPropagation.
користувач113716

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


чи можливо використовувати це рішення з модулем експорту nodejs? коли я спробую це, я отримую помилку "не використовується мітка". export.MyFunction = функція (дані) {myFunction: {break myFunction;}}
Юрій Алмейда

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

return false; набагато краще, ніж просто return;


13
Чому falseкраще? Я б сказав, що за замовчуванням undefinedкраще в загальному випадку. Так чи інакше, ви правильно вважаєте, що часто краще повернути змістовне значення.
Бред Кох

Це залежить від програміста і залежить від випадку використання. Наприклад, функція може щось перевірити, тому, якщо перевірка не вдасться, повернути більше сенсу, falseніж undefined.
Адам МакАртур

18

Це:

function myfunction()
{
     if (a == 'stop')  // How can I stop working of function here?
     {
         return;
     }
}

11

Використовуючи трохи інший підхід, ви можете використовувати try catch, із заявою кидання.

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, або значення, яке ви задаєте за допомогою команди return.

function myfunction(){
    if(a=="stop"){
        //return undefined;
        return; /** Or return "Hello" or any other value */
    }
}

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)
  }
}

Сподіваюся, це може бути корисним для будь-кого.


Дух. Це так просто, що я ніколи про це не думав !! Дуже корисно уникати великих вкладених ІФ. Дякую.
Деббі А

Це було б краще з перемикачем.
bdelmas

Залежить, якщо ви хочете отримувати всі сповіщення про помилки одразу, про що ви будете сповіщені лише про одне. Однак кожну умову все одно потрібно виконати.
Лев

0

Я думаю, що викинути нову помилку - це гарний підхід до зупинки виконання, а не просто повернення чи повернення хибного. Для екс. Я перевіряю кількість файлів, які дозволяють завантажувати максимум п'ять файлів в окремій функції.

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 працює лише в тому випадку, якщо ви перебуваєте в головній функції виконання, інакше це не працює.



-4

Якщо ви використовуєте jquery. Це повинно зупинити функцію від бульбашки до того, щоб батьківська функція, яка викликає цю функцію, також повинна зупинитися.

  function myfunction(e)
  {
       e.stopImmediatePropagation();
       ................
  }

6
stopImmediatePropagation()- це не річ jQuery, а зупинка розповсюдження - це не те саме, що закриття функції.
Бред Кох

-13

введіть будь-яку випадкову команду, яка видає помилку, наприклад:

exit

або

die:-)

Це може зупинити виконання коду, не лише решту функції. Перевірте скрипку: jsfiddle.net/b3k0xo7n/1
treecon

1
Який жахливий підхід до програмування. Як це інтуїтивно зрозуміло для іншого розробника, який працює на тій же кодовій базі?
осул
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.