Uscita anticipata dalla funzione?


402

Ho una funzione:

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

C'è qualcosa come exit()in JavaScript?


4
vuoi interrompere l'esecuzione o tornare?
Ken Struys,

@Ken Struys qual è la differenza? come ho capito, se ritorno, interrompe l'esecuzione? non è vero?
Simon,

3
Bene, ecco il punto, l'uso di un ritorno tornerà semplicemente al contesto della funzione chiamante. Se vuoi effettivamente la semantica di uscita che desideri interrompere l'esecuzione, potresti fare qualcosa del genere: vikku.info/codesnippets/javascript/…
Ken Struys,

1
@Ken - Il link che hai fornito riguarda l'interruzione dell'esecuzione di un forloop. Anche allora, non ho idea del perché il metodo suggerito sarebbe stato usato, quando potevi semplicemente chiamare break;. Per usare l'esempio dell'articolo: L' if(i==5) break;uso returninterromperà l'esecuzione della funzione, indipendentemente dal fatto che tu sia o meno in un forciclo.
user113716

Syom - Sì, returninterromperà l'esecuzione della funzione, che sembra essere ciò che hai chiesto.
user113716

Risposte:


639

Puoi semplicemente usare return.

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

Questo invierà un valore di ritorno undefineda qualunque cosa abbia chiamato la funzione.

var x = myfunction();

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

Ovviamente, puoi specificare un valore di ritorno diverso. Qualunque valore venga restituito verrà registrato nella console usando l'esempio sopra.

return false;
return true;
return "some string";
return 12345;

4
So che questo è un vecchio post, e questa è una pratica comune, ma penso che questa sia una cattiva soluzione. Se la funzione è SUPPOSTA per restituire un valore, è necessario utilizzare return. Se usi ciecamente return, potresti riscontrare problemi in seguito. Soprattutto se si iniziano eventi vincolanti che hanno un ritorno in essi. Dai

64
@dbme: le funzioni in JavaScript ritornano sempre . L'istruzione return è implicita se non è stata fornita. Il valore di ritorno predefinito è undefineded è quello che offre la mia soluzione principale. L'articolo a cui hai fatto riferimento parla di fare return falsein un gestore di eventi jQuery. Questa è una questione completamente diversa. Questo è il modo corretto di uscire da una funzione JavaScript. Ovviamente se il chiamante si basa sul valore restituito, il valore deve essere definito in modo appropriato.
user113716

3
... Una variazione implicita sarebbe if(a != 'stop') { /* run my code */ }che il codice venga eseguito solo quando anon è uguale 'stop'senza fornire un esplicito return. Ma il valore restituito è identico alla mia soluzione . In entrambi i casi, undefinedverrà restituito.
user113716

3
Risposta eccezionale. Non mi rendevo conto che ci fosse differenza tra il ritorno di undefined vs false vs un valore diverso. Ho cercato di trovare una risposta definitiva riguardo a questo comportamento nell'ultima ora. Quindi è sicuro dire (per ribadire il tuo punto) che il ritorno è un modo sicuro al 100% per uscire da un metodo, anche se il chiamante è legato ad eventi, ecc.?

@dbme: tutto dipende da cosa ci si aspetta dal metodo che chiama la funzione. Se una libreria di codici definisce un sistema di eventi che si interromperà se riceve undefined(o non riceve alcun altro valore) come valore di ritorno, sarà necessario conformarsi alle specifiche dell'API e restituire il valore corretto. Generalmente per un sistema di gestione degli eventi, si aspetterà undefinedcome semplice indicazione che il gestore ha terminato e non ci sono ulteriori istruzioni. Con jQuery, return false;ha un significato speciale che dà istruzioni per fare un preventDefaulte stopPropagation.
user113716

49

Apparentemente puoi farlo:

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

Vedi gli ambiti di blocco tramite l'uso di un'etichetta: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label

Non riesco ancora a vedere alcun aspetto negativo. Ma non sembra un uso comune.

Deriva questa risposta: equivalente JavaScript del dado di PHP


è possibile utilizzare questa soluzione con il modulo export di nodejs? quando lo provo ottengo l'errore "etichetta non utilizzata". exports.MyFunction = function (data) {myFunction: {break myFunction;}}
Yuri Almeida

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

return false; è molto meglio di solo return;


13
Perché è falsemeglio? Direi che l'impostazione predefinita undefinedè migliore nel caso generico. Ad ogni modo, hai ragione a dire che spesso è meglio restituire un valore significativo.
Brad Koch,

Dipende dal programmatore e dipende dal caso d'uso. Ad esempio, una funzione potrebbe convalidare qualcosa, quindi se la convalida non riesce ha più senso per il ritorno falsedi undefined.
Adam McArthur,

18

Questo:

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

11

Utilizzando un approccio leggermente diverso, è possibile utilizzare try catch, con istruzione throw.

function name() {
    try {
        ...

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

        ...
    } catch (e) {
        // TODO: handle exception
    }
}

3

se stai cercando uno script per evitare di inviare il modulo quando vengono rilevati alcuni errori, questo metodo dovrebbe funzionare

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

cambia il tipo di pulsante Invia in "pulsante"

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

spero che questo aiuto.


2

L'uso di a returninterromperà la funzione e restituirà undefined, o il valore specificato con il comando return.

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

1

Non mi piace rispondere a cose che non sono una vera soluzione ...

... ma quando ho riscontrato questo stesso problema, ho fatto una soluzione alternativa di seguito:

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

Spero che possa essere utile per chiunque.


Duh. È così semplice che non ci ho mai pensato !! Abbastanza utile per evitare i grandi IF annidati. Grazie.
Debbie A

Questo sarebbe meglio con un interruttore.
bdelmas,

Dipende se si desidera avere tutti gli avvisi di errore in una volta, essere avvisati di uno solo. Tuttavia, ogni condizione deve essere eseguita comunque.
Leone

0

Penso che lanciare un nuovo errore sia un buon approccio per fermare l'esecuzione piuttosto che semplicemente restituire o restituire false. Per es. Sto convalidando un numero di file che consento solo un massimo di cinque file per il caricamento in funzione separata.

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

Ma sto chiamando questa funzione dalla funzione di flusso principale come

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

Nell'esempio sopra non riesco a fermare l'esecuzione a meno che non lanci un nuovo errore. Solo return o return false funziona solo se si è nella funzione principale dell'esecuzione, altrimenti non funziona.



-4

Se stai usando jquery. Questo dovrebbe impedire alla funzione di gorgogliare, quindi anche la funzione genitore che chiama questo dovrebbe arrestarsi.

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

6
stopImmediatePropagation()non è una cosa jQuery e interrompere la propagazione non è la stessa cosa che uscire da una funzione.
Brad Koch,

-13

digitare qualsiasi comando casuale che genera un errore, ad esempio:

exit

o

die:-)

Ciò può impedire l'esecuzione di tutto il codice, non solo il resto della funzione. Controlla il violino: jsfiddle.net/b3k0xo7n/1
treecon

1
Che approccio di programmazione terribile. In che modo è intuitivo per un altro sviluppatore che lavora sulla stessa base di codice?
osullic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.