Pergunta

Como funciona uma declaração de retorno dentro de um bloco de tentativa/captura?

function example() {
    try {
        return true;
    }
    finally {
        return false;
    }
}

Estou esperando que a saída desta função seja true, mas em vez disso é false!

Foi útil?

Solução

Finalmente sempre executa. É para isso que serve, o que significa que o retorno é usado no seu caso.

Você vai querer alterar seu código para que seja mais assim:

function example() { 
    var returnState = false; // initialisation value is really up to the design
    try { 
        returnState = true; 
    } 
    catch {
        returnState = false;
    }
    finally { 
        return returnState; 
    } 
} 

De um modo geral, você nunca quer ter mais de uma declaração de retorno em uma função, coisas como essa são por que.

Outras dicas

De acordo com a ECMA-262 (5ED, dezembro de 2009), na pp. 96:

A produção TryStatement : try Block Finally é avaliado da seguinte maneira:

  1. Seja B o resultado da avaliação do bloco.
  2. Seja f o resultado de avaliar finalmente.
  3. Se F.Type for normal, retorne B.
  4. Retornar F.

E da pp. 36:

O tipo de conclusão é usado para explicar o comportamento das declarações (break, continue, return e throw) que realizam transferências não -locais de controle. Os valores do tipo de conclusão são triplos do formulário (tipo, valor, destino), Onde modelo é um dos normal, break, continue, return, ou throw, valor é qualquer valor da linguagem do ECMAScript ou vazio, e alvo é qualquer identificador ECMAScript ou vazio.

Está claro que return false definiria o tipo de conclusão de finalmente Como Retorna, que causa try ... finally façam 4. Retornar f.

Quando você usa finally, qualquer código dentro desse bloqueio incêndio antes do método sair. Porque você está usando um retorno no finally Block, ele chama return false e substitui o anterior return true no try quadra.

(A terminologia pode não estar certa.)

Por que você está ficando falso é que você retornou em um bloco finalmente. Finalmente, o bloco deve executar sempre. então seu return true muda para return false

function example() {
    try {
        return true;
    }
    catch {
        return false;
    }
}

Tanto quanto eu sei, o finally quadra sempre executa, independentemente de você ter um return declaração dentro try ou não. Ergo, você recebe o valor retornado pelo return declaração interna finalmente bloco.

Eu testei isso com o Firefox 3.6.10 e o Chrome 6.0.472.63 ambos no Ubuntu. É possível que esse código possa se comportar de maneira diferente em outros navegadores.

O Block Rewrits Try Block Return (figurativamente falando).

Só queria ressaltar que, se você retornar algo de finalmente, ele será devolvido da função. Mas se, finalmente, não houver palavra 'retorno' - ela será devolvida o valor do bloco de tentativas;

function example() {
    try {
        return true;
    }
    finally {
       console.log('finally')
    }
}
console.log(example());
// -> finally
// -> true

Então -Finalmente- return reescrever o retorno de -try- return.

Finalmente, deve sempre ser executado no final de um bloco de tentativa, para que (por especificação) seja o motivo pelo qual você está recebendo falso devolvido. Lembre -se de que é inteiramente possível que diferentes navegadores tenham implementações diferentes.

Que tal isso?

doubleReturn();

function doubleReturn() {
  let sex = 'boy';

  try {
    return sex;

    console.log('this never gets called...');
  } catch (e) {} finally {
    sex = 'girl'; 

    alert(sex);
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top