2012-07-30 14 views
76

Supongamos que tengo un bucle como este:¿El retorno detiene un ciclo?

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

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

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

Una pregunta rápida: ¿El return detener la ejecución del bucle en sí mismo?

Respuesta

99

Sí, return detiene la ejecución y sale de la función. return siempre sale de su función de inmediato, sin ejecución adicional si está dentro de un bucle.

Se comprueba fácilmente por sí mismo:

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

alert(returnMe()); 
// 1 

Nota: Ver this other answer sobre el caso especial de try/catch/finally.

+5

> return siempre sale de su función de inmediato, sin ejecución adicional si está dentro de un bucle [... a menos que sea para cada bucle] (http: // stackoverflow.com/questions/34653612/what-does-return-keyword-mean-inside-foreach-function/34653650) –

+3

@ o-o Más o menos cierto. 'return' aún regresa de la iteración actual de la función de devolución de llamada, en su propio ámbito, pero no se espera que se rompa desde el método de llamada completo' forEach() '. Por lo tanto, no regresa desde _loop itself_, pero está volviendo de la devolución de llamada que ejecuta el ciclo. En el ejemplo de código de la pregunta vinculada, la salida es '1,2,4,5 'omitiendo el' 3' debido a la devolución. –

+0

Tal vez el hilo rojo es que 'return' volverá siempre del actual contexto 'this'. –

5

Sí, una vez que se ejecuta la instrucción return, toda la función se cierra en ese mismo punto.

Imagínese lo que sucedería si no lo hiciera y continúa bucleando, y ejecutando esa instrucción return cada vez? Invalidaría su significado de devolver un valor cuando lo piense.

36

En la mayoría de los casos (incluido este), return saldrá inmediatamente. Sin embargo, si el retorno se encuentra en un bloque try con un bloque finally, el finally siempre se ejecuta y puede "anular" el return en el .

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

"retorno" hace salir de la función, pero si usted quiere devolver grandes sumas de datos, se puede almacenar en una matriz y luego devolverlo en lugar de tratar de volver cada pieza de datos 1 por 1 en el lazo.

0

La instrucción return detiene un ciclo solo si hay un bucle dentro de la función. De lo contrario, obtendrá este error:

Uncaught SyntaxError: Illegal return statement(…) 
0

La respuesta es sí, si se escribe instrucción de retorno de los controles se remonta a la persona que llama al método de inmediato. Con la excepción de finally block, que se ejecuta después de la declaración de devolución.

y finalmente también puede anular el valor que ha devuelto, si regresa dentro de finally block. LINK: Try-catch-finally-return clarification

Retorno Declaración definición según:

Java Docs:

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

MSDN Documentación:

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

Necesita vincular correctamente las fuentes que utilizó, e idealmente formatear las comillas también. –

+0

¿Se ve bien ahora? – user1179299

+0

Aprecio las correcciones gramaticales, pero todavía no hay ningún enlace, y todavía no estás usando el formato blockquote. –

Cuestiones relacionadas