Listado completo de tutoriales
ES6 - Arrow functions (funciones flecha) |
Las funciones flecha es una nueva sintaxis propuesta en ES6 para expresar las funciones anónimas.
Un ejemplo de definir una arrow function es:
const mayor = (x,y) => { if (x>y) return x; else return y; } document.write(mayor(10,2));
Como es una función anónima si queremos guardar una referencia a la misma se la debemos asignar a una constante o variable. Indicamos entre paréntesis los parámetros de la función luego la flecha => y finalmente entre llaves el algoritmo propiamente de la función.
Con la sintaxis anterior de JavaScript este algoritmo lo codificamos con la sintaxis:
const mayor = function(x,y) { if (x>y) return x; else return y; } document.write(mayor(10,2));
Ordenar un vector de enteros mediante el método sort, pasar una arrow function.
<!DOCTYPE html> <html> <head> <title>Ejemplo de JavaScript</title> <meta charset="UTF-8"> </head> <body> <script> const vec = [100, 22, 17, 50, 3]; vec.sort((x, y) => { if (x > y) return 1; else return -1; }) document.write(vec.toString()); </script> </body> </html>
A la función sort le pasamos una función flecha.
Cuando una función flecha tiene un parámetro no es necesario encerrarlo entre paréntesis:
const vec = [100, 22, 17, 50, 3]; vec.forEach(elemento => { document.write(elemento+' '); })
En este ejemplo el parámetro 'elemento 'es único y por eso no lo encerramos entre paréntesis.
Podemos definir funciones flecha de una única línea, en dichas situaciones no es necesario encerrar entre llaves el algoritmo.
const doble = x => x*2; document.write(doble(10)); //20 document.write(doble(7)); //14
La función tiene un único parámetro llamado x y su algoritmo es multiplicar el valor que llega por 2. La función retorna el resultado sin tener que indicar la palabra clave return.
Otro ejemplo de arrow function con dos parámetros y resuelto con una única expresión:
const mayor = (x, y) => (x>y)?x:y; document.write(mayor(7, 20)) // 20 document.write(mayor(60, 40)) // 60
Conociendo entonces que podemos definir funciones flecha de una única línea podemos plantear el algoritmo de ordenar un vector con una sintaxis más concisa:
const vec = [100, 22, 17, 50, 3]; vec.sort((x,y) => (x>y)?1:-1); document.write(vec.toString());
Definir un vector con un conjunto de elementos. Generar un nuevo vector llamando al método filter pasando una función de flecha para definir cuales rescatar.
<!DOCTYPE html> <html> <head> <title>Ejemplo de JavaScript</title> <meta charset="UTF-8"> </head> <body> <script> const vec = [100, 22, 17, 50, 3, 78]; const pares = vec.filter(elemento => elemento % 2 == 0); document.write('Vector completo:' + vec.toString()); document.write('<br>'); document.write('Vector generado con elementos pares:' + pares.toString()); </script> </body> </html>
Una función flecha que no tiene parámetros debemos disponer en forma obligatoria los paréntesis abiertos y cerrados previos a la flecha:
<!DOCTYPE html> <html> <head> <title>Ejemplo de JavaScript</title> <meta charset="UTF-8"> </head> <body> <script> window.addEventListener( 'DOMContentLoaded', setTimeout(() => alert('pasó 3 segundos desde que se cargó la página'), 3000), false); </script> </body> </html>
Registramos en el evento 'DOMContentLoaded' de la página la referencia de la llamada a la función setTimeout pasando a esta función una función de flecha que no tiene parámetros y que tiene por objetivo mostrar una ventana de alerta.
El uso de las arrow functions se está generalizando en la programación en JavaScript.
<!DOCTYPE html> <html> <head> <title>Ejemplo de JavaScript</title> <meta charset="UTF-8"> </head> <body> <script> var objeto1 = { x: 10, metodo1: function() { alert(this.x); }, metodo2: () => { alert(this.x); } } objeto1.metodo1(); //10 objeto1.metodo2(); //undefined </script> </body> </html>
Cuando definimos un método con funciones flecha no existe el contexto de this para acceder a las propiedades del objeto. Es decir que las funciones flecha son más adecuadas cuando las trabajamos como funciones independientes y no como métodos de un objeto.