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ó?

frenchie
fonte

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.

Michael Berkowski
fonte
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
John Girata
fonte
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(…)
Damjan Pavlica
fonte
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
}
Madeira Persa
fonte
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.

Keldon Alleyne
fonte
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.

user1179299
fonte
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.

Brendon McBain
fonte