¿Return detiene un bucle?


Supongamos que tengo un bucle como este:

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

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

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

Pregunta rápida: ¿el return detiene la ejecución del bucle en sí mismo?

Author: RedBassett, 2012-07-30

6 answers

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

Se verifica fácilmente por ti mismo:

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

alert(returnMe());
// 1

Nota: Ver esta otra respuesta sobre el caso especial de try/catch/finally.

 130
Author: Michael Berkowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:55:06

En la mayoría de los casos (incluyendo este), return saldrá inmediatamente. Sin embargo, si el retorno está en un bloque try con un bloque finally adjunto, el finally siempre se ejecuta y puede "anular" el return en el 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
 46
Author: John Girata,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-30 01:45:31

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

Imagínese lo que pasaría si no lo hiciera y continuara haciendo loop, y ejecutando esa return declaración cada vez? Invalidaría su significado de devolver un valor cuando lo piensas.

 5
Author: Keldon Alleyne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-30 01:42:40

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

Uncaught SyntaxError: Illegal return statement(…)
 3
Author: Damjan Pavlica,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-12 09:07:34

"return" sale de la función, pero si desea devolver grandes sumas de datos, puede almacenarlos en una matriz y luego devolverlos en lugar de intentar devolver cada pieza de datos 1 por 1 en el bucle.

 0
Author: Brendon McBain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-30 01:45:47

La respuesta es sí, si escribe la instrucción return los controles vuelven al método de llamada inmediatamente. Con la excepción de finally block, que se ejecuta después de la instrucción return.

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

Devuelve la definición de la declaración según:

Java Docs:

Se puede usar una sentencia return para ramificar fuera de un bloque de flujo de control y salir del método

Documentación de MSDN:

La sentencia return termina la ejecución de una función y devuelve control a la función de llamada. Ejecución se reanuda en el función de llamada en el punto inmediatamente posterior a la llamada.

Wikipedia:

Una sentencia return hace que la ejecución deje la subrutina actual y reanudar en el punto en el código inmediatamente después de donde el la subrutina fue llamada, conocida como su dirección de retorno. La dirección del remitente se guarda, generalmente en la pila de llamadas del proceso, como parte del operación de hacer la llamada de subrutina. Declaraciones de retorno en muchos los idiomas permiten que una función especifique un valor de retorno que se devolverá al código que llamó a la función.

 0
Author: user1179299,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-01 02:43:53