JavaScript: Guía completa. Alessandra Salvaggio
Чтение книги онлайн.
Читать онлайн книгу JavaScript: Guía completa - Alessandra Salvaggio страница 14
Veamos cómo ocurre todo esto, puesto que la función contiene muchas novedades.
En primer lugar, además de la constante que representa la fecha, se crea otra que representa la duración de un día en milisegundos, porque la diferencia entre las fechas será devuelta exactamente en milisegundos y nosotros podremos utilizar el valor de esta constante para aplicar el resultado obtenido a varios días.
const milsegEnUnDia = 1000 * 60 * 60 * 24
Una vez hecho esto, indicamos la fecha de hoy a media noche. Si no lo hacemos, la fecha contiene también la hora del momento en que se ha creado y será más difícil de comparar con la fecha que crearemos con los parámetros pasados a la función que, en cambio, no contendrá un horario y, por tanto, hará referencia a la media noche:
hoy.setHours(0, 0, 0, 0);
setHours
, efectivamente, ajusta la hora de una fecha. Requiere como argumentos hora, minutos, segundos y milisegundos.
En este momento, creamos la fecha con los parámetros que han sido pasados, sin olvidarnos de restar 1 al valor pasado para el mes, dado que JavaScript utiliza para los meses números que van del 0 (enero) al 11 (diciembre).
const fechaEvento = new Date(año, mes - 1, dia);
Para que nuestra función se comporte correctamente con o sin la horal legal, debemos ajustar el horario de la fecha de hoy de manera que tenga en cuenta el posible cambio de hora causado por la hora legal:
const diferenciaHoras = Math.abs(fechaEvento.getTimezoneOffset() / 60) - Math.abs(hoy.getTimezoneOffset() / 60);hoy.setHours(hoy.getHours() - diferenciaHoras);
Como ya sabéis (puesto que lo hemos visto en el capítulo ¡Hola mundo!), getTimezoneOffset
devuelve la diferencia en minutos entre el UTC y la hora local. Si dividimos este resultado entre 60, obtendremos las horas.
En este momento, recurrimos al objeto Math
, que todavía no había salido, y que nos permite ejecutar operaciones matemáticas. En concreto con
abs()
obtenemos la parte absoluta (positiva) de un número (en España, getTimezoneOffset
devuelve siempre un número negativo).
Si restamos el resultado de la diferencia en horas entre los dos eventos, obtenemos el espacio que necesitamos para alinear la fecha actual con la fecha de nuestro evento: lo hacemos con setHours()
.
NOTA | Existen diversas funciones que nos permiten elaborar un número con el objeto Math:•abs() : devuelve el valor absoluto de un número.•acos() : devuelve el arcocoseno en radianes.•asin() : devuelve el arcoseno en radianes.•atan() : devuelve el arcotangente como valor numérico comprendido entre ¬Π/2 y Π/2 radianes.•atan2() : devuelve el arcotangente del cociente de sus argumentos.•ceil() : devuelve el valor de su argumento redondeando por exceso al entero más cercano.•cos() : devuelve el coseno expresado en radianes.•exp() : devuelve el valor de e elevado al valor pasado como argumento.•floor() : devuelve el valor de su argumento redondeado por defecto al entero más cercano.•log() : devuelve el logaritmo natural en base e del número pasado como argumento.•max() : devuelve el valor máximo entre los argumentos que le han pasado.•min() : devuelve el valor mínimo entre los argumentos que le han pasado.•pow() : devuelve el valor del primer argumento pasado, elevado al valor del segundo argumento.•random() : devuelve un número aleatorio comprendido entre 0 y 1.•round() : devuelve su argumento redondeado al entero más cercano.•sin() : devuelve el seno expresado en radianes.•sqrt() : devuelve la raíz cuadrada.•tan() : devuelve la tangente. |
Cuando las fechas se indican en la misma referencia horaria, con una instrucción if
configuramos los mensajes que la función debe devolver: si el evento es posterior a hoy, es decir, su fecha es mayor que la fecha actual, el mensaje contendrá el número de días que faltan para el event; si no, indicará que la fecha ya ha pasado.
if (fechaEvento > hoy) {return `Faltan ${(fechaEvento.getTime() - hoy.getTime()) / milsegEnUnDia} días a ${NombreEvento}`;} else {return 'La fecha ya pasó'}
En nuestro ejemplo, hemos pasado a la función los valores (año-mes-día) para construir una fecha, pero nada nos impide pasar a la función directamente un objeto fecha:
<script type="text/javascript">function cuantosDias(fecha, evento) {let hoy = new Date();const milsegEnUnDia = 1000 * 60 * 60 * 24hoy.setHours(0, 0, 0, 0);const diferenciaHoras = Math.abs(fecha.getTimezoneOffset() / 60) - Math.abs(hoy.getTimezoneOffset() / 60);hoy.setHours(hoy.getHours() - diferenciaHoras);if (fechaEvento > hoy)return `Faltan ${(fecha.getTime() - hoy.getTime()) / milsegEnUnDia} días para ${evento}`;elsereturn 'La fecha ya pasó'}const fechaEvento =new Date(2017, 11, 25);document.getElementById('output').innerHTML = cuantosDias(fechaEvento, 'Navidad');</script>
Puedes encontrar este ejemplo en el archivo FuncionesParametros2 .html
Funciones anónimas
En los ejemplos con los que hemos trabajado hasta ahora, siempre hemos asignado un nombre a las funciones. JavaScript también permite crear funciones anónimas y asignarlas a una variable. Esta operación es posible porque en JavaScript function
es un tipo que se puede almacenar en una variable. En otros lenguajes esto no es posible.
<script type="text/javascript">let suma = function (x,y){return x + y;}console.log(suma(34,67));</script>
Puedes encontrar este ejemplo en el archivo FuncionesAnonimas .html
Al utilizar la variable, podemos especificar entre sus paréntesis los parámetros que deseamos utilizar.
Las funciones anónimas también pueden ser utilizadas como parámetros para otras funciones. A lo largo de este libro, conoceremos ejemplos de este uso.
El área de validez de variables y constantes
Cuando se empiezan a utilizar funciones, es preciso prestar atención al área de validez de variables y constantes, es decir, a las partes del código donde variables y constantes pueden ser utilizadas. En nuestro ejemplo, hemos declarado la constante dia
dentro de la función EsFinDeSemana
.
function EsFinDeSemana() { const dia = new Date().getDay(); return dia === 0 || dia === 6;}
La constante existe solo dentro de la función y no puede ser utilizada fuera de ella. Por esta razón, podemos decir que el área de validez (en inglés scope) de la constante dia
es la función esFinDeSemana
. También se dice que dia
es una constante local de la función esFinDeSemana
. El mismo discurso vale para las variables.
Si definimos una variable o una constante fuera de una función, esta se denomina global y puede ser utilizada en cualquier lugar, incluso