2012-07-30 15 views
76

Supponiamo che io sono un ciclo come questo:Il ritorno interrompe un ciclo?

for (var i = 0; i < SomeArrayOfObject.length; i++) { 

    if (SomeArray[i].SomeValue === SomeCondition) { 

    var SomeVar = SomeArray[i].SomeProperty; 
    return SomeVar; 
    } 
} 

Domanda veloce: fa il return fermare l'esecuzione del ciclo in sé e per sé?

risposta

99

Sì, return interrompe l'esecuzione ed esce dalla funzione. return chiude sempre immediatamente la sua funzione, senza ulteriore esecuzione se si trova all'interno di un ciclo.

è facilmente verificata di persona:

function returnMe() { 
    for (var i=0; i<2; i++) { 
    if (i === 1) return i; 
    } 
} 

alert(returnMe()); 
// 1 

Nota: vedere this other answer sul caso particolare di try/catch/finally.

+5

> return esce sempre immediatamente dalla sua funzione, senza ulteriori esecuzioni se si trova all'interno di un loop [... a meno che non si tratti di un ciclo forEach] (http: // stackoverflow.it/questions/34653612/what-does-return-keyword-mean-inside-foreach-function/34653650) –

+3

@ o-o Una sorta di vero. 'return' restituisce ancora dall'iterazione corrente della funzione callback, nel proprio ambito, ma non ci si aspetta che si interrompa dall'intero metodo di chiamata' forEach() '. Quindi non ritorna dallo _loop stesso_, ma sta ritornando dal callback che il ciclo esegue. Nell'esempio di codice della domanda collegata, l'output è '1,2,4,5' saltando' 3' a causa del ritorno. –

+0

Forse il thread rosso è che 'return' tornerà sempre dal contesto corrente' this'. –

5

Sì, dopo l'esecuzione dell'istruzione return, l'intera funzione viene chiusa proprio in quel punto.

Immaginate cosa succederebbe se non lo facesse e continuasse il ciclo, ed eseguendo quella dichiarazione return ogni volta? Avrebbe invalidato il suo significato di restituire un valore quando ci pensate.

36

Nel nella maggior parte dei casi (incluso questo), return uscirà immediatamente. Tuttavia, se il reso è in un blocco try con un blocco finally, il numero finally viene sempre eseguito e può "ignorare" lo return nello try.

function foo() { 
    try { 
     for (var i = 0; i < 10; i++) { 
      if (i % 3 == 0) { 
       return i; // This executes once 
      } 
     } 
    } finally { 
     return 42; // But this still executes 
    } 
} 

console.log(foo()); // Prints 42 
+0

oldie but goodie –

0

"ritorno" fa uscire dalla funzione, ma se si vuole tornare grandi somme di dati, è possibile memorizzare in un array e poi tornare invece di cercare di ritornare ogni pezzo di dati 1 da 1 nel ciclo continuo.

0

L'istruzione return interrompe un ciclo solo se un loop si trova all'interno della funzione. In caso contrario, si otterrà questo errore:

Uncaught SyntaxError: Illegal return statement(…) 
0

La risposta è sì, se si scrive un'istruzione return i controlli risale al al metodo chiamante immediatamente. Con l'eccezione del blocco finally, che viene eseguito dopo l'istruzione return.

e infine può anche sovrascrivere il valore restituito, se si ritorna all'interno del blocco finally. LINK: Try-catch-finally-return clarification

Return definizione economico di cui:

Java Docs:

a return statement can be used to branch out of a control flow block and exit the method

MSDN Documentazione:

The return statement terminates the execution of a function and returns control to the calling function. Execution resumes in the calling function at the point immediately following the call.

Wikipedia:

A return statement causes execution to leave the current subroutine and resume at the point in the code immediately after where the subroutine was called, known as its return address. The return address is saved, usually on the process's call stack, as part of the operation of making the subroutine call. Return statements in many languages allow a function to specify a return value to be passed back to the code that called the function.

+0

È necessario collegare correttamente le origini utilizzate e formattare idealmente anche le virgolette. –

+0

sembra buono ora? – user1179299

+0

Apprezzo le correzioni di grammatica, ma non ci sono ancora collegamenti e non stai ancora utilizzando la formattazione blockquote. –

Problemi correlati