O retorno para um loop?


157

Suponha que eu tenha um loop como este:

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

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

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

Pergunta rápida: returnpara a execução do loop por si só?

Respostas:


206

Sim, returninterrompe a execução e sai da função. returnsempre ** sai de sua função imediatamente, sem execução adicional se estiver dentro de um loop for.

É facilmente verificado por si mesmo:

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

alert(returnMe());
// 1

** Notas: Veja esta outra resposta sobre o caso especial de try/catch/finally e esta resposta sobre como os loops forEach têm seu próprio escopo de função não sairá da função que o contém.


25
> Retorno sempre sai sua função imediatamente, sem posterior execução se é dentro de um loop ... a menos que seja um loop foreach
— oo

9
@oo Tipo de verdade. returnainda retorna da iteração atual do retorno de chamada da função, em seu próprio escopo, mas não seria esperado interromper todo o método de chamada forEach(). Portanto, ele não está retornando do próprio loop , mas está retornando do retorno de chamada que o loop executa. No exemplo de código da pergunta vinculada, a saída está 1,2,4,5ignorando o resultado 3do retorno.
— Michael Berkowski

Talvez o fio vermelho seja que returnsempre retorne do thiscontexto atual .
— oo

A alternativa para usar forEach () ou for () em uma matriz para "potencialmente" final de loop precoce é usar some ().
— AnBisw

1
Eu sei que isso é trivial para algumas pessoas, mas isso é tão bom porque você não precisa mais breake então return.
— No.17

60

Na maioria dos casos (incluindo este), returnsairá imediatamente. No entanto, se o retorno estiver em um trybloco com um finallybloco acompanhante , o finallysempre executará e poderá "substituir" o returnno 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

8

A returninstrução interrompe um loop apenas se estiver dentro da função. Caso contrário, você receberá este erro:

Uncaught SyntaxError: Illegal return statement(…)

6

Este código sairá do loop após a primeira iteração em um for ofloop:

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

o código abaixo pulará na condição e continuará em um for ofloop:

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

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

Obrigado, isso ajuda-me muito, eu estou usando nó eo retorno está quebrando meu para, para cada um e para ... de, as obras continuam como eu esperava
— veroneseComS

5

Sim, uma vez que o return instrução é executada, a função inteira é encerrada nesse exato momento.

Imagine o que aconteceria se isso não acontecesse e continuasse repetindo e executando essa returninstrução a cada vez? Isso invalidaria o significado de retornar um valor quando você pensar sobre isso.


1

A resposta é sim, se você escrever a declaração de retorno, os controles voltarão imediatamente ao método de chamada. Com exceção do bloco finalmente, que é executado após a declaração de retorno.

e, finalmente, também pode substituir o valor que você retornou, se você retornar dentro do bloco finalmente. LINK: Esclarecimento de tentar pegar e finalmente retornar

Definição da declaração de retorno de acordo com:

Documentos do Java:

uma declaração de retorno pode ser usada para ramificar fora de um bloco de fluxo de controle e sair do método

Documentação do MSDN:

A instrução de retorno finaliza a execução de uma função e retorna o controle para a função de chamada. A execução continua na função de chamada no ponto imediatamente após a chamada.

Wikipedia:

Uma instrução de retorno faz com que a execução deixe a sub-rotina atual e continue no ponto do código imediatamente após o local de chamada da sub-rotina, conhecida como endereço de retorno. O endereço de retorno é salvo, geralmente na pilha de chamadas do processo, como parte da operação de fazer a chamada de sub-rotina. As instruções de retorno em vários idiomas permitem que uma função especifique um valor de retorno a ser passado de volta ao código que chamou a função.


Você precisa vincular corretamente as fontes que você usou e, idealmente, formatar as aspas também.
— Nathan Tuggy

isso parece bom agora?
— User1179299

Agradeço as correções gramaticais, mas ainda não existem links, e você ainda não está usando a formatação de citação em bloco.
— Nathan Tuggy

0

"return" sai da função, mas se você deseja retornar grandes somas de dados, pode armazená-las em uma matriz e depois devolvê-las, em vez de tentar retornar cada pedaço de dados 1 por 1 no loop.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.