En muchos navegadores que he probado, los bloques de JavaScript realmente devuelven un valor. Puede probarlo en cualquier consola:Utilizando el valor de retorno de un bloque en JavaScript
for(var i = 0; i < 10; i++) {
var sqrt = Math.sqrt(i);
if(Math.floor(sqrt) === sqrt) {
i;
}
}
El valor de "retorno" es el último número cuadrado, es decir, 9! Pero como no es una expresión, supongo, no puede hacer esto:
for(var i = 0; i < 10; i++) {
...
} + 5
Eso no funciona. Da + 5
, o 5
, por supuesto, porque es una declaración separada. Poner el bucle entre paréntesis obviamente falla, y si un bloque está entre paréntesis (por ejemplo, ({f(); r})
- no funciona) se trata como un objeto y arroja un error de sintaxis.
Una forma de aprovechar el valor de retorno, como tal, es el uso de eval
:
eval('for(var i = 0; i < 10; i++) {var sqrt = Math.sqrt(i);if(Math.floor(sqrt) === sqrt) {i;}}') + 5; // 14
Pero obviamente no voy a querer utilizar eval
que si es la única solución. ¿Hay alguna manera de usar el valor resultante de un bloque sin usar eval
que me falta? Me gusta mucho esta característica :)
Los bloques son declaraciones, no expresiones. Por lo tanto, no puede usarlos como operandos (no puede usar operadores en ellos) ... –
@ ŠimeVidas: Exactamente, ¿hay alguna forma de hacer que funcionen? ¿No usas 'eval'? – Ryan
Debe tratar el valor de retorno de 'eval' como la anomalía, no la restricción que JS" normalmente "(léase: ignorar afuera' eval') impone. Los bloques son ** no ** expresiones. – delnan