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 en posibles funciones, y mantiene su valor durante toda la ejecución del código.
Lo que acabamos de explicar es la teoría general referente al área de validez de las variables.
ECMAScript 6 presenta una aclaración más: el área de validez a nivel de bloque (blocked-level).
Tanto let
como const
generan variables y constantes a nivel de bloque.
Esto significa que, si en una función, por ejemplo, hay un bloque if
y una variable o una constante se definen con let
o const
en el bloque if
, estas existirán solo en el bloque y no en toda la función.
Por ejemplo:
function miFuncion() {if (true) {let variable = 123;}console.log(variable);}
La función anterior nos devolvería un error porque variable
existe solo en el bloque if
y no la podemos utilizar fuera de ella para mostrar el valor en la consola.
Debemos profundizar en esta cuestión, precisando que let
fue introducida a partir de ECMAScript 6 (2015) y no está disponible en las versiones anteriores del programa.
En las versiones de JavaScript anteriores, para declarar una variable se utilizaba la palabra var,
que también se utiliza en ECMAScript 6.
Tratemos de entender por qué es conveniente utilizar let
.
Las instrucciones:
var nombreUsuario1 = 'Mario Rossi';let nombreUsuario2 = 'Paolo Bianchi';
desarrollan exactamente las mismas operaciones:
•Crean un área de memoria suficientemente amplia para conservar los caracteres de las cadenas.
•Asignan a esta área el nombre “nombreUsuario1”/“nombreUsuario2”.
La diferencia entre ambas consiste en su área de validez o scope.
Ya hemos dicho que el área de validez de let
es el bloque. Pues bien, el área de validez de var
, en cambio, es la función.
Veamos un ejemplo para explicarlo mejor; utilizamos una función que acepta como parámetros de entrada un array de números y calcula su suma y su media aritmética.
function mediaConVar1(numeros) {var suma = 0;for (var indice = 0; indice < numeros.length; indice += 1) {suma += numeros[indice];}var media = suma / numeros.length;return `Los ${numeros.length} números tienen suma=${suma} y media=${media}. El índice es ${indice}`;}
Ejemplo de uso de la función: