¿El retorno detiene un bucle?

Resuelto frenchie asked hace 12 años • 7 respuestas

Si tengo el siguiente forbucle


    for (var i = 0; i < SomeArrayOfObject.length; i++) {
    
      if (SomeArray[i].SomeValue === SomeCondition) {

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

¿ La returndeclaración detiene la ejecución de la función?

frenchie avatar Jul 30 '12 08:07 frenchie
Aceptado

Sí, las funciones siempre finalizan cuando su flujo de control cumple con una returndeclaración.

El siguiente ejemplo demuestra cómo returnlas declaraciones finalizan la ejecución de una función.

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

console.log(returnMe());
Expandir fragmento

Notas: consulte esta otra respuesta sobre el caso especial de trycatchfinallyy esta respuesta sobre cómo la forEachdevolución de llamada tiene su propio alcance de función, por lo que no saldrá de la función que la contiene.

Michael Berkowski avatar Jul 30 '2012 01:07 Michael Berkowski

En la mayoría de los casos (incluido éste), returnsaldrá inmediatamente. Sin embargo, si la devolución está en un trybloque con un finallybloque que lo acompaña, finallysiempre se ejecuta y puede "anular" el returnen el archivo 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 avatar Jul 30 '2012 01:07 John Girata

Este código saldrá del bucle después de la primera iteración del 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á a 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
}
PersianIronwood avatar Apr 16 '2019 09:04 PersianIronwood

La returndeclaración detiene un bucle sólo si está dentro de la función (es decir, finaliza tanto el bucle como la función). De lo contrario, obtendrá este error:

Uncaught SyntaxError: Illegal return statement(…)

Para terminar un bucle debes usar break.

Damjan Pavlica avatar Mar 10 '2016 08:03 Damjan Pavlica