¿El retorno detiene un bucle?

157

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: ¿ returndetiene la ejecución del bucle en sí mismo?

frenchie
fuente

Respuestas:

206

Sí, returndetiene la ejecución y sale de la función. returnsiempre ** sale de su función inmediatamente, sin más ejecución si está dentro de un bucle for.

Se verifica fácilmente por usted mismo:

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

alert(returnMe());
// 1

** Notas: Vea esta otra respuesta sobre el caso especial de try/catch/finally y esta respuesta sobre cómo forEach loops tiene su propio alcance de función que no saldrá de la función que lo contiene.

Michael Berkowski
fuente
25
> return siempre sale de su función de inmediato, sin más ejecución si está dentro de un bucle ... a menos que sea un bucle forEach
oo
9
@oo Más o menos cierto. returntodavía regresa de la iteración actual de la devolución de llamada de la función, en su propio ámbito, pero no se espera que se rompa del método de llamada completo forEach(). Por lo tanto, no regresa del bucle en sí , sino que regresa de la devolución de llamada que ejecuta el bucle. En el ejemplo de código de la pregunta vinculada, la salida se 1,2,4,5saltea 3debido a la devolución.
Michael Berkowski
Tal vez el hilo rojo es que returnsiempre volverá del thiscontexto actual .
oo
La alternativa al uso de forEach () o for () en una matriz para la terminación de bucle temprana "potencialmente" es usar some ().
AnBisw
1
Sé que esto es trivial para algunas personas, pero esto es tan bueno saber porque ya no tiene que breaky después return.
NoName
60

En la mayoría de los casos (incluido este), returnsaldrá inmediatamente. Sin embargo, si el retorno está en un trybloque con un finallybloque que lo acompaña , el finallysiempre se ejecuta y puede "anular" el returnen 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
John Girata
fuente
8

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

Uncaught SyntaxError: Illegal return statement(…)
Damjan Pavlica
fuente
6

Este código saldrá del bucle después de la primera iteración en un for ofbucle:

const objc = [{ name: 1 }, { name: 2 }, { name: 3 }];
for (const iterator of objc) {
  if (iterator.name == 2) {
    return;
  }
  console.log(iterator.name);// 1
}

el siguiente código saltará sobre la condición y continuará en un for ofbucle:

const objc = [{ name: 1 }, { name: 2 }, { name: 3 }];

for (const iterator of objc) {
  if (iterator.name == 2) {
    continue;
  }
  console.log(iterator.name); // 1  , 3
}
PersaIronwood
fuente
Gracias, esto me ayudó mucho, estoy usando el nodo y el retorno está rompiendo mi para, para cada y para ... de, el continuar funciona como esperaba
veroneseComS
5

Sí, una vez returnque se ejecuta la instrucción, se abandona toda la función en ese mismo punto.

¿Imagínese lo que sucedería si no fuera así y continuara dando vueltas y ejecutando esa returndeclaración cada vez? Invalidaría su significado de devolver un valor cuando lo piense.

Keldon Alleyne
fuente
1

La respuesta es sí, si escribe una declaración de devolución, los controles vuelven al método de llamada inmediatamente. Con la excepción de finalmente bloquear, 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 del bloque finalmente. ENLACE: aclaración Try-catch-finally-return

Definición de declaración de devolución según:

Documentos de Java:

una declaración de retorno se puede usar para ramificarse de un bloque de flujo de control y salir del método

Documentación de MSDN:

La declaración return finaliza la ejecución de una función y devuelve el control a la función que realiza la llamada. La ejecución se reanuda en la función de llamada en el punto inmediatamente posterior a la llamada.

Wikipedia:

Una instrucción return hace que la ejecución abandone la subrutina actual y se reanude en el punto del código inmediatamente después de donde se llamó a la subrutina, conocida como su dirección de retorno. La dirección de retorno se guarda, generalmente en la pila de llamadas del proceso, como parte de la operación de realizar la llamada de subrutina. Las declaraciones de retorno en muchos idiomas permiten que una función especifique un valor de retorno que se devolverá al código que llamó a la función.

usuario1179299
fuente
Debe vincular correctamente las fuentes que utilizó e idealmente formatear las citas también.
Nathan Tuggy
¿Se ve bien ahora?
user1179299
Aprecio las correcciones gramaticales, pero todavía no hay ningún enlace, y todavía no estás usando el formato blockquote.
Nathan Tuggy
0

"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 dato 1 por 1 en el bucle.

Brendon McBain
fuente