Pourquoi un retour dans "enfin" remplacement "d'essayer"?
Comment une instruction de retour à l'intérieur d'un bloc try/catch travail?
function example() {
try {
return true;
}
finally {
return false;
}
}
J'attends la sortie de cette fonction à true
, mais au lieu de cela, il est false
!
Vous devez vous connecter pour publier un commentaire.
Enfin toujours exécute. Qu'est ce que c'est, ce qui signifie qu'il est de retour est utilisé dans votre cas.
Vous aurez envie de changer votre code de sorte qu'il ressemble plutôt à ça:
Une manière générale, vous ne voulez jamais avoir plus d'une instruction return dans une fonction, ce genre de choses sont pourquoi.
Selon l'ECMA-262 (5ed, décembre 2009), pp. 96:
Et de pp. 36:
Il est clair que
return false
serait mis d'achèvement type de enfin comme retour, qui causetry ... finally
faire 4. De Retour De F.Lorsque vous utilisez
finally
, tout code au sein du bloc de feux de avant la sortie de la méthode. Parce que vous êtes à l'aide d'un retour dans lefinally
bloc, il appellereturn false
et remplace la précédentereturn true
dans letry
bloc.(Terminologie peut-être pas tout à fait à droite.)
pourquoi vous obtenez de faux est de retour dans un bloc finally. enfin, le bloc devrait exécuter toujours. si votre
return true
changements àreturn false
Autant que je sache, le
finally
bloc toujours exécute, indépendamment de savoir si vous avez unreturn
déclaration à l'intérieur detry
ou pas. Ergo, vous obtenez la valeur retournée par lareturn
déclaration à l'intérieur de bloc finally.J'ai testé avec Firefox 3.6.10 et Chrome 6.0.472.63 à la fois dans Ubuntu. Il est possible que ce code peut se comporter différemment dans d'autres navigateurs.
Le bloc finally réécrit bloc try retour (au sens figuré).
Voulais juste faire remarquer, que si vous retournez quelque chose de finalement, il sera retourné par la fonction. Mais si finalement il n'y a pas de "retour" mot -, il sera renvoyé de la valeur du bloc try;
Donc -enfin-
return
réécrit le retour de essayez-return
.Enfin est censé TOUJOURS exécuté à la fin d'un bloc try catch, de sorte que (par specification) est pourquoi vous obtenez false est retourné. Gardez à l'esprit qu'il est tout à fait possible que les différents navigateurs ont des implémentations différentes.
Quoi à ce sujet?