Diferencia entre funciones normales y funciones flecha en javascript

La diferencia principal entre una función flecha - arrow function y una función normal en JavaScript radica en cómo manejan el contexto de this, aunque también hay diferencias de sintaxis.
1. Sintaxis
-
Función normal
function sumar(a, b) {
return a + b;
} -
Función flecha - Arrow function
const sumar = (a, b) => {
return a + b;
};Diferencias:
-
Las arrow functions pueden tener una sintaxis más corta.
-
Si solo tienen una expresión, el resultado se retorna automáticamente (sin necesidad de usar
return), esto se conoce como retorno implícitoconst sumar = (a, b) => a + b; -
Si hay un solo parámetro, se pueden omitir los paréntesis
const cuadrado = x => x * x;
Veamos la transformación de una función normal a una función flecha en su mínima expreción:
-
Función normal
function sumar(a, b) {
return a + b;
} -
Convirtiendola en función flecha
const sumar = (a, b) => {
return a + b;
}; -
Al solo retornar una expreión se deja el retorno implícito
const sumar = (a, b) => a + b;
-
-
2. this y el contexto
-
Función normal
El valor de
thisdepende de cómo se llama a la función. Puede cambiar según el contexto, por ejemplo, si se usa en un objeto, evento o función constructora.const obj = {
valor: 10,
sumar: function () {
return this.valor + 5;
},
};
console.log(obj.sumar()); // 15 -
Arrow function
Al utilizar una función de flecha esta no crea automáticamente una variable
this. Como resultado, cualquier referencia athisapuntaría a lo quethisera antes de que se creara la funciónconst obj = {
valor: 10,
sumar: () => this.valor + 5, // `this` no apunta al objeto
};
console.log(obj.sumar()); // NaN, porque `this.valor` es undefinedconst obj = {
nombre: "Juanjo",
print: () => console.log(this), // `this` no apunta al objeto
};
console.log(obj.print()); // Window (objeto global)Esto hace que las arrow functions sean ideales para callbacks, como en los métodos de array o los manejadores de eventos, donde no se desea que
thiscambie.
3. Uso con constructores
-
Función normal
Se pueden usar funciones normales como constructores con
new.function Persona(nombre) {
this.nombre = nombre;
}
const persona = new Persona("Juan");
console.log(persona.nombre); // "Juan" -
Arrow function
No se pueden usar como constructores y lanzan un error si intentas hacerlo.
const Persona = (nombre) => {
this.nombre = nombre;
};
const persona = new Persona("Juan"); // Error: Persona is not a constructor
4. arguments
-
Función normal
Las funciones normales tienen acceso al objeto especial
arguments, que contiene los parámetros pasados a la función.function sumar() {
return Array.from(arguments).reduce((a, b) => a + b);
}
console.log(sumar(1, 2, 3)); // 6 -
Arrow function
Las arrow functions no tienen el objeto
arguments, pero se puede usar el operador rest agregado en la versión de Ecmascript 2015 ES5 (...args).const sumar = (...args) => args.reduce((a, b) => a + b);
console.log(sumar(1, 2, 3)); // 6
Resumen
| Característica | Función Normal | Arrow Function |
|---|---|---|
| Sintaxis | Verbosa | Más corta |
this | Depende del contexto de ejecución | Hereda el this del contexto |
| Uso como constructor | Permitido | No permitido |
arguments | Disponible | No disponible, usa ...args |
| Retorno implícito | No | Sí, si es una sola expresión |
