javascript - document.title jquery
¿Por qué una devolución en `finalmente` anula` try`? (7)
¿Cómo funciona una declaración de devolución dentro de un bloque try / catch?
function example() {
try {
return true;
}
finally {
return false;
}
}
¡Espero que la salida de esta función sea true
, pero en cambio es false
!
¿Qué hay de esto?
doubleReturn();
function doubleReturn() {
let sex = ''boy'';
try {
return sex;
console.log(''this never gets called...'');
} catch (e) {} finally {
sex = ''girl'';
alert(sex);
}
}
Cuando finally
usa, cualquier código dentro de ese bloque se dispara antes de que el método salga. Como está utilizando una devolución en el bloque finally
, llama a return false
y anula la return true
anterior en el bloque try
.
(La terminología puede no ser del todo correcta)
De acuerdo con ECMA-262 (5ed, diciembre de 2009), en pp. 96:
La producción
TryStatement : try Block Finally
se evalúa de la siguiente manera:
- Deje B ser el resultado de evaluar Block.
- Deje F ser el resultado de evaluar finalmente.
- Si F.type es normal, devuelva B.
- Retorno F.
Y de la página 36:
El tipo de finalización se utiliza para explicar el comportamiento de las declaraciones (
break
,continue
,return
ythrow
) que realizan transferencias de control no locales. Los valores del tipo de finalización son triples de la forma (tipo, valor, destino) , donde el tipo es unonormal
,break
,continue
,return
othrow
, value es cualquier valor de lenguaje ECMAScript o está vacío, y target es cualquier identificador ECMAScript o vacío.
Está claro que return false
establecería el tipo de finalización de finally como return , que causaría try ... finally
to 4. 4. Devuelve F.
Finalmente siempre se ejecuta. Para eso es, lo que significa que su devolución se usa en su caso.
Deberá cambiar su código para que se parezca más a esto:
function example() {
var returnState = false; // initialisation value is really up to the design
try {
returnState = true;
}
catch {
returnState = false;
}
finally {
return returnState;
}
}
En general, nunca desea tener más de una declaración de devolución en una función, este es el motivo.
Finalmente, se supone que SIEMPRE debe ejecutarse al final de un bloque try catch para que (por especificación) sea el motivo por el que recibe un falso return. Tenga en cuenta que es muy posible que diferentes navegadores tengan diferentes implementaciones.
Hasta donde yo sé, el bloque finally
siempre se ejecuta, independientemente de si tiene una declaración de return
dentro de try
o no. Ergo, obtienes el valor devuelto por la instrucción return
dentro del bloque finally.
Probé esto con Firefox 3.6.10 y Chrome 6.0.472.63 ambos en Ubuntu. Es posible que este código se comporte de manera diferente en otros navegadores.
por qué estás obteniendo el resultado falso es que regresaste en un bloque final. finalmente el bloque debería ejecutarse siempre. por lo que su return true
cambios para return false
function example() {
try {
return true;
}
catch {
return false;
}
}