Wczesne wyjście z funkcji?

402

Mam funkcję:

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

Czy jest coś takiego jak exit()w JavaScript?

Szymon
źródło
4
chcesz przerwać wykonanie lub zwrócić?
Ken Struys,
@Ken Struys jaka jest różnica? jak rozumiem, jeśli wrócę, to zatrzyma wykonanie? prawda?
Simon
3
Cóż, oto rzecz: użycie return spowoduje powrót do kontekstu funkcji wywołującej. Jeśli naprawdę chcesz semantycznego wyjścia, chcesz zatrzymać wykonywanie, możesz zrobić coś takiego: vikku.info/codesnippets/javascript/…
Ken Struys
1
@Ken - Podany link dotyczy zatrzymania wykonywania forpętli. Nawet wtedy nie mam pojęcia, dlaczego proponowana metoda miałaby być używana, skoro można po prostu zadzwonić break;. Aby skorzystać z przykładu z artykułu: if(i==5) break;Użycie returnspowoduje zatrzymanie wykonywania funkcji, niezależnie od tego, czy jesteś w forpętli , czy nie .
user113716,
Syom - Tak, returnzatrzyma wykonywanie funkcji, która wydaje się być tym, o co prosiłeś.
user113716,

Odpowiedzi:

639

Możesz po prostu użyć return.

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

Spowoduje to wysłanie wartości zwracanej undefineddo dowolnej funkcji.

var x = myfunction();

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

Oczywiście możesz podać inną wartość zwracaną. Jakakolwiek wartość zostanie zwrócona, zostanie zarejestrowana w konsoli na powyższym przykładzie.

return false;
return true;
return "some string";
return 12345;
użytkownik113716
źródło
4
Wiem, że to stary post i jest to powszechna praktyka, ale myślę, że to złe rozwiązanie. Jeśli funkcja ma WIELKOŚĆ, aby zwrócić wartość, powinieneś użyć return. Jeśli ślepo użyjesz return, możesz później napotkać problemy. Zwłaszcza jeśli zaczniesz wiązać zdarzenia, które się w nich zwracają. Sprawdź ten post, aby uzyskać więcej informacji: fuelyourcoding.com/jquery-events-stop-misusing-return-false
64
@dbme: Funkcje w JavaScript zawsze zwracają. Instrukcja return jest domyślna, jeśli nie została dostarczona. Domyślna wartość zwracana to undefined, i to właśnie zapewnia moje podstawowe rozwiązanie. Artykuł, do którego się odwołujesz, mówi o wykonywaniu return falsew module obsługi zdarzeń jQuery. To zupełnie inna sprawa. To jest właściwy sposób na wyjście z funkcji JavaScript. Oczywiście, jeśli dzwoniący opiera się na zwracanej wartości, wartość tę należy odpowiednio zdefiniować.
user113716
3
... Domyślna odmiana byłaby if(a != 'stop') { /* run my code */ }taka, że ​​kod działa tylko wtedy, gdy anie jest równy, 'stop'bez podania wyraźnego return. Ale zwracana wartość jest identyczna z moim rozwiązaniem . W obu przypadkach undefinedzostaną zwrócone.
user113716
3
Niesamowita odpowiedź. Nie zdawałem sobie sprawy, że istnieje jakakolwiek różnica między zwrotem niezdefiniowanym a fałszywym vs inną wartością. Przez ostatnią godzinę próbowałem znaleźć ostateczną odpowiedź dotyczącą tego zachowania. Czy można więc bezpiecznie (powtórzyć swój punkt), że return jest w 100% bezpiecznym sposobem na wyjście z metody, nawet jeśli osoba dzwoniąca jest związana ze zdarzeniami itp.?
@dbme: Cóż, wszystko zależy od tego, czego oczekuje metoda wywołująca funkcję. Jeśli jakaś biblioteka kodów definiuje system zdarzeń, który się zepsuje, jeśli odbierze undefined(lub nie otrzyma innej wartości) jako wartość zwracaną, musisz dostosować się do specyfikacji tego interfejsu API i zwrócić poprawną wartość. Zasadniczo dla systemu obsługi zdarzeń oczekuje się, że będzie undefinedto proste wskazanie, że procedura obsługi zakończyła się i nie ma żadnych dalszych instrukcji. W jQuery return false;ma specjalne znaczenie udzielając instrukcji, aby wykonać preventDefaulta stopPropagation.
user113716
49

Najwyraźniej możesz to zrobić:

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

Zobacz zakresy bloków za pomocą etykiety: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label

Nie widzę jeszcze żadnych wad. Ale nie wydaje się to powszechnym zastosowaniem.

Pochodzi z tej odpowiedzi: JavaScriptowy odpowiednik die PHP

CMCDragonkai
źródło
czy można używać tego rozwiązania z modułem eksportu nodejs? kiedy próbuję, pojawia się błąd „nieużywana etykieta”. exports.MyFunction = function (data) {myFunction: {break myFunction;}}
Yuri Almeida
20
function myfunction() {
     if(a == 'stop') 
         return false;
}

return false; jest znacznie lepszy niż tylko return;

Xlaok
źródło
13
Dlaczego falselepiej Powiedziałbym, że domyślna opcja undefinedjest lepsza w ogólnym przypadku. Tak czy inaczej, masz rację mówiąc, że często lepiej jest zwrócić znaczącą wartość.
Brad Koch
To zależy od programisty i zależy od przypadku użycia. Na przykład funkcja może coś sprawdzić, więc jeśli sprawdzenie się nie powiedzie, bardziej sensowne jest zwrócenie falseniż undefined.
Adam McArthur
18

To:

function myfunction()
{
     if (a == 'stop')  // How can I stop working of function here?
     {
         return;
     }
}
Obrabować
źródło
11

Używając nieco innego podejścia, możesz użyć try catchz instrukcją throw.

function name() {
    try {
        ...

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

        ...
    } catch (e) {
        // TODO: handle exception
    }
}
Rodney Salcedo
źródło
3

jeśli szukasz skryptu, aby uniknąć przesyłania formularza po wykryciu błędów, ta metoda powinna działać

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

zmień typ przycisku Prześlij na „przycisk”

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

Mam nadzieję, że to pomoże.

Awal Istirdja
źródło
2

Użycie a returnspowoduje zatrzymanie funkcji i powrót undefinedlub wartość określoną za pomocą polecenia return.

function myfunction(){
    if(a=="stop"){
        //return undefined;
        return; /** Or return "Hello" or any other value */
    }
}
Seizefire
źródło
1

Nie lubię odpowiadać na rzeczy, które nie są prawdziwym rozwiązaniem ...

... ale kiedy napotkałem ten sam problem, przedstawiłem poniższe obejście:

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

Mam nadzieję, że może być przydatny dla każdego.

Lew
źródło
Duh. To takie proste, że nigdy o tym nie myślałem !! Bardzo przydatne, aby uniknąć dużych zagnieżdżonych IF. Dzięki.
Debbie A
Byłoby lepiej z przełącznikiem.
bdelmas
Zależy, czy chcesz otrzymywać wszystkie alerty o błędach jednocześnie, czy będziesz powiadamiany tylko o jednym. Jednak i tak każdy warunek musi zostać wykonany.
Leo
0

Myślę, że wyrzucenie nowego błędu jest dobrym podejściem do zatrzymania wykonania, a nie tylko zwrócenie lub zwrócenie wartości false. Np. Sprawdzam poprawność liczby plików, które zezwalam na przesłanie maksymalnie pięciu plików w osobnej funkcji.

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

Ale tę funkcję nazywam z głównej funkcji przepływu jako

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

W powyższym przykładzie nie mogę zatrzymać wykonywania, dopóki nie wyrzucę nowego błędu. Zwrócenie lub zwrócenie wartości false działa tylko wtedy, gdy jesteś w głównej funkcji wykonywania, w przeciwnym razie nie zadziała.

Bedram Tamang
źródło
-3

wyjście(); można użyć, aby przejść do następnej weryfikacji.

Chirag Dineshbhai Ponda
źródło
-4

Jeśli używasz jquery. To powinno powstrzymać funkcję przed pojawieniem się bąbelków, więc funkcja nadrzędna wywołująca to również powinna przestać.

  function myfunction(e)
  {
       e.stopImmediatePropagation();
       ................
  }
silvster27
źródło
6
stopImmediatePropagation()nie jest rzeczą jQuery, a zatrzymanie propagacji nie jest tym samym, co wyjście z funkcji.
Brad Koch
-13

wpisz dowolne polecenie, które generuje błąd, na przykład:

exit

lub

die:-)
amrali
źródło
Może to uniemożliwić wykonanie całego kodu, nie tylko reszty funkcji. Sprawdź skrzypce: jsfiddle.net/b3k0xo7n/1
treecon
1
Co za okropne podejście do programowania. Jak to jest intuicyjne dla innego programisty, który pracuje na tej samej bazie kodu?
osullic