Tema 3. JavaScript avanzado
Tema 3. JavaScript avanzado
Ideas clave
3.3. Argumentos
3.10. Closures
A fondo
Test
Esquema
Dos términos que constituyen el núcleo de JavaScript son los objetos y las
funciones. Por un lado, los objetos engloban las distintas formas de agrupar
información (arrays, sets, mapas, etc.). Por otro lado, las funciones son las
información nueva. Esto no es otra cosa, sino el objetivo básico de cualquier lenguaje
Dicho de otra manera, los objetos y las funciones son lo que hacen de JavaScript un
informática y la tecnología.
Pero JavaScript nos tiene guardada una sorpresa más: las funciones son también
objetos. Esto quedará más resaltado sobre todo cuando estudiemos las funciones
de
retrollamada o callbacks.
▸ Las funciones asociadas a arrays, sets y mapas, también conocidas como funciones
de orden superior.
▸ El objeto this.
siguiente:
entrada que comentaremos más tarde. Fíjate también que ambos ejemplos acaban
en un punto y coma (;) en la última línea. Esto es así porque se trata de una
Todas las funciones tienen una propiedad, su nombre (name). Es posible acceder
Figura 3. Cómo acceder a una propiedad de una función. Fuente: elaboración propia.
significar una cosa, las funciones son objetos. Otra cosa que te resultará curiosa es
que, si lo piensas, en los ejemplos anteriores hemos usado una notación literal para
definir una función. ¿Acaso no existe una notación para definir funciones que haga
uso de constructores? Pues sí, es esta:
Invocación de funciones
Una vez que hemos definido nuestra función, ya podemos invocarla. Al hacerlo, se
Figura 6.Importancia de los paréntesis para invocar funciones. Fuente: elaboración propia.
derivado. Al igual que en matemáticas, las funciones devuelven «cosas» (no solo
números). Para indicar que una función retorna algún tipo de información, se usa la
Figura 8. Guardar el resultado devuelto por una función. Fuente: elaboración propia.
Esquemáticamente, una función suele representarse como una caja negra en la que,
Accede al vídeo:
https://unir.cloud.panopto.eu/Panopto/Pages/Embed.aspx?id=d77e9a00-ee28-
42e6-88df-b1d800df1e5c
3.3. Argumentos
Los argumentos o parámetros son los valores que se les pasan a las funciones
como entrada.
Desde dentro de la función, las instrucciones que la componen tienen acceso a estos
En primer lugar, una función tiene acceso a valores y variables externos que se
ejemplo anterior, la función tiene acceso a la constante c (la velocidad de la luz) sin
mayor problema, ya que esta ha sido definida en el mismo bloque que contiene la
definición de la función energia (en este caso es el bloque correspondiente al ámbito
global).
Por otro lado, en el ejemplo también se muestra la nueva manera introducida en ES6
Pero ¿cómo podemos, desde dentro de una función, acceder a un número arbitrario
de argumentos? Para ello, JavaScript cuenta con una variable especial llamada
arguments. Esta variable no es más que una especie de pseudoarray (no es un array
real) que contiene cada uno de los parámetros que se pasan a la función en orden.
Podemos referirnos a cada uno de ellos usando la misma notación para seleccionar
A partir del ES6 existe una mejor forma de trabajar con un número arbitrario de
Desde el ES6, las funciones pueden tener parámetros por defecto. Es decir, si no
Figura 13. Función con argumentos por defecto. Fuente: elaboración propia.
Con ES6 también se introduce una nueva sintaxis para definir funciones, esta nueva
CoffeeScript.
presencia de una flecha (=>). Este símbolo separa los parámetros que recibe una
Ejemplo:
El ámbito de uso de las funciones flecha es, sobre todo, para especificar funciones
que sean cortas: pocas líneas de código (normalmente tan solo una) y lógica sencilla.
▸ No es necesario usar la notación de bloque ({}) si la función solo tiene una línea de
código.
▸ La cláusula return tampoco es necesaria si la función solo tiene una línea. En este
Veamos un ejemplo:
en lugar de solo a + b.
consta de dos líneas de código, por lo que ya hay que poner llaves indicadoras de
bloque ({}). Por las mismas razones, también es necesario indicar explícitamente el
funciones que se pasan como parámetro a otras funciones. Sí, además de cadena de
texto, números, arrays, objetos, etc., también podemos pasar funciones. No podía
ser de otra manera, ya que las funciones también son objetos. Por ejemplo, una
Puedes comprobar por ti mismo cómo lo que hemos hecho es definir una función
Fragmento de JavaScript 18. Función con una callback. Fuente: elaboración propia.
callback. Esta callback (yAlgoMas) no es más que una función sencilla de tipo arrow,
que simplemente devuelve una cadena de texto fija. Con estos dos valores,
JavaScript.
Por un lado, si una función flecha no acepta parámetros, tenemos que seguir
Esto debería llamarte la atención. Hasta ahora, siempre que usábamos algo (una
Casi todos los lenguajes de programación legendarios (C, C++, etc.) tienen este
Las funciones de orden superior no son más que métodos que se aplican sobre
Recorrido de arrays
En cada llamada de la callback (que tiene forma de función flecha en este caso), se
pasa el valor de un elemento concreto (matematico) y el índice que ocupa dentro del
array (indice). Con estos dos parámetros, forEach permite realizar operaciones sobre
sido definida previamente. Aparece sin nombre y directamente como parámetro del
Derivación de arrays
El método .map(callback) permite hacer algo parecido al forEach(), solo que, en cada
Filtrado de arrays
cuales son testeados por la función callback, la cual los recibe uno a uno. Cada
prueba debe devolver true o false según se pase o no. Veamos un ejemplo que filtra
solo los números impares de un array que contiene, inicialmente, tanto impares como
pares.
los arrays.
▸ undefined y null.
Los objetos literales no son más que conjuntos de propiedades y sus valores. Los
valores de las propiedades pueden ser a su vez cadenas de texto, números, etc. e
la llama método.
Los objetos son como pequeñas bases de datos que contienen parejas de propiedad
y valor. En ese sentido, son parecidos a los mapas que vimos anteriormente. La
salvedad es que las propiedades son ahora solo cadenas de texto y sus valores
objetos.
mismo lugar.
Para definir un objeto usando la notación literal o directa, simplemente tenemos que
valor.
Ejemplo:
En este ejemplo hemos definido un objeto (buzz) que tiene tres propiedades. Una de
ellas (nombre) es una cadena texto (tipo básico), otra es un array (amigos) y la otra
se corresponde con una función, escrita con notación de flecha. De igual manera, los
constantes:
Desde ES6, se incorpora una nueva sintaxis resumida para definir objetos literales.
refiere tienen el mismo nombre, basta con poner unas de las dos.
En este ejemplo, hemos creado un objeto (rex) con una propiedad llamada nombre,
que recibe como valor el albergado en una variable con el mismo, valga la
redundancia, nombre.
Habrás podido comprobar que hemos estado creando objetos usando una notación
literal, de ahí que nos estemos refiriendo todo el tiempo a objetos literales.
utilizada:
Métodos y propiedades
(objeto.propiedad). Ejemplo:
Figura 26. Acceso a propiedades con notación de punto. Fuente: elaboración propia.
Figura 27. Acceso a propiedades con notación de corchetes. Fuente: elaboración propia.
Ejemplo:
Figura 28. Acceso a métodos con notación de punto. Fuente: elaboración propia.
Como se trata de una función que queremos que se ejecute, tenemos que sufijar los
Figura 29. Acceso a métodos con notación de corchetes. Fuente: elaboración propia.
¿Cómo podemos comprobar si un objeto tiene una propiedad? Para eso JavaScript
La versión ES8 (ojo, no ES6) que vio la luz en 2017 añade el método Object.values().
Este funciona de manera parecida al anterior, pero ahora devuelve un array con los
Modificación de objetos
claro con qué propiedades cuenta. En cualquier momento podemos añadir una
existente:
Eso sí, a la hora de borrar propiedades tenemos que usar un nuevo operador
ejemplo:
métodos. Sin embargo, hay que tener en cuenta que, a diferencia de los tipos
básicos, cuando un objeto es pasado como parámetro en una función, este pasa por
referencia.
copia de este. Esta afirmación no vale para los datos básicos (cadenas de texto y
números).
El uso de objetos literales como parámetros de función tiene una utilidad muy
La palabra especial this en JavaScript usada dentro de, por ejemplo, un objeto, hace
referencia al propio objeto. Es, en cierta medida, equivalente al this de Java o al self
sus propiedades y hacer cosas con ellas desde las funciones/métodos del propio
objeto:
misma. Importante, para hacer referencia a this desde una función definida en un
objeto, tenemos que usar la notación habitual de funciones. Dicho de otra manera:
Las promesas son una nueva manera de llamar a las funciones callback. En ese
asíncrono como los de las funciones AJAX. Cuando una promesa se crea, esta
invoca una función asíncrona y al objeto promesa (sí, son objetos, como los
algoFueMal(). Puedes comprobar por ti mismo como, a pesar de que las promesas
solucionan gran parte del código sucio del que eran culpables las callbacks, todavía
▸ Este tipo de funciones están precedidas por la palabra clave async. Dentro de este
▸ En cada línea de esta función tenemos que spousar el operador await para marcar
una variable. Las siguientes líneas de código no se ejecutan hasta que la promesa
se resuelve.
reservada async, lo que implica que la función se ejecuta de manera asíncrona (es
decir, al mismo tiempo que el código restante del programa). Dentro de la función,
cada línea se ejecuta línea a línea y esto lo garantiza la palabra reservada await.
3.10. Closures
Los closures (o cierres, aunque jamás se usa su traducción en español) son una de
closure es una referencia a una variable que fue creada en el ámbito de otra función,
pero esta variable permanece accesible y puede ser usada en otra parte del
programa.
sido declarada en su ámbito. La función funciónInterna(), por otro lado, tiene acceso
Esto implica que siempre que una función sea declarada dentro de otra
La potencia de los closures radica en que podemos definir una función que devuelve
otra función que tiene acceso a las variables de la primera. Esta potencia puede
Una fábrica de funciones es una función externa que permite crear funciones hijas
donde cada función fuese una transformación concreta de una unidad a otra:
En el ejemplo anterior, con una sencilla fábrica de funciones hemos definido dos
funciones:
GitHub. https://github.com/UnirCs/DWFS-GLOBAL/tree/master/Tema_3
conceptos que hemos ido trabajando en los tres primeros temas de la asignatura.
Concretamente:
▸ Crearemos un archivo HTML index.html que contendrá, como mínimo, un botón con
el texto "Dame un chiste", que, cada vez que se presione, realizará una llamada
contra la API de chistes aleatorios de Chuck Norris, y volcará el chiste recibido en un
párrafo <p> del documento HTML.
▸ El script para realizar esta acción estará dentro del propio archivo HTML.
▸ Eventos de JavaScript.
▸ Crearemos un archivo CSS styles.css que contendrá cualquier estilo que queramos
aplicar al documento HTML.
La petición asíncrona que debe realizarse para obtener los datos del chiste debe
obstante, podéis obtener más información de esta API aquí. Se recomienda también
leer la documentación sobre Response, el objeto que recibimos tras utilizar fetch,
para averiguar cómo obtener el JSON de la respuesta recibida. La función JS
Por último, para actualizar de forma dinámica el contenido del párrafo, sin necesidad
de recargar la página web AJAX, haremos uso del método getElementById del
objeto document (el cual estudiaremos en el siguiente tema), por lo que será
https://www.w3schools.com/jsref/event_onclick.asp
Ejemplo de resultado
uno o en ambos ficheros. En el próximo tema, veremos cómo hacer esto mismo de
▸ Debes hacer una llamada a la función únicamente a modo de prueba, por ejemplo,
suggest(8) desde el HTML. La propia función debe tener un log que muestre el set
▸ La función debe ejecutarse cuando el contenido del input cambie. Para ello, debes
usar:
• El evento onInput del input en el archivo HTML. Aquí tienes más información sobre
este evento. Si bien podrían haberse usado otros eventos, como onChange , en este
caso, este evento es el más adecuado. Puedes probar las diferencias entre ambos si
quieres.
Ejemplo de resultado
Ten en cuenta que los resultados que se muestran en la consola en estos ejemplos
corresponden a una matriz de 10x10, tal como se daba en el código de apoyo del
funciona correctamente.
Estado inicial:
side_web_APIs/Fetching_data
Element: innerHTML property - Web APIs (2024, 26 julio). MDN Web Docs.
https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
Response: json() method - Web APIs (2024, 8 octubre). MDN Web Docs.
https://developer.mozilla.org/en-US/docs/Web/API/Response/json
E d u o n i x . https://blog.eduonix.com/web-programming-tutorials/learn-event-driven-
programming-node-js/
JavaScript.
y#
Esta página web muestra los métodos más usados sobre arrays.
A. No es posible en JavaScript.
A. Undefined.
B. Un array que lista las propiedades del objeto como cadenas de texto.
B. =>.
C. Un tipo de bucle.
C. Un método.
C. Es imposible.
A. Verdadero.
B. Falso.
A. Verdadero.
B. Falso.
C. Son distintos.