Junior
¿Cuál es la diferencia entre funciones flecha y funciones normales en JavaScript?
sobes.tech AI
Respuesta de la IA
- Sintaxis:
- Función normal:
function myFunction() { ... } - Función flecha:
() => { ... }oparam => { ... }
- Función normal:
- Contexto
this:- Función normal:
thisse determina por el contexto de llamada. - Función flecha:
thisse hereda léxicamente del ámbito circundante (no tiene su propiothis).
- Función normal:
- Constructores:
- Función normal: Puede usarse como constructor (
new myFunction()). - Función flecha: No puede usarse como constructor.
- Función normal: Puede usarse como constructor (
- Objeto
arguments:- Función normal: Tiene su propio objeto
argumentscon los argumentos pasados. - Función flecha: No tiene su propio objeto
arguments, el acceso a los argumentos se realiza mediante parámetros rest (...args).
- Función normal: Tiene su propio objeto
- Funciones nombradas:
- Función normal: Puede ser nombrada (
function myFunction() { ... }). - Función flecha: Por defecto anónima, se asigna a una variable para nombrarla (
const myFunction = () => { ... }).
- Función normal: Puede ser nombrada (
- Retorno implícito:
- Función normal: Requiere explícitamente
returnpara devolver un valor (excepto en casos simples como IIFE). - Función flecha: En un cuerpo de una sola línea puede devolver implícitamente el resultado de una expresión sin
return.
- Función normal: Requiere explícitamente
Tabla comparativa:
| Característica | Función normal | Función flecha |
|---|---|---|
| Sintaxis | function name() { ... } |
() => { ... } |
Contexto this |
Dinámico (según la llamada) | Léxico (del ámbito padre) |
| Constructor | Sí | No |
Objeto arguments |
Sí | No (usa parámetros rest) |
| Nombramiento | Puede ser nombrada | Anónima (se asigna) |
| Retorno implícito | No (normalmente requiere return) |
Sí (para cuerpo de una línea) |
// Ejemplo de funciones normales
function standardFunction() {
console.log(this); // Depende del contexto de llamada
console.log(arguments); // Objeto arguments disponible
}
const obj = {
method: standardFunction
};
standardFunction(); // `this` será window (en navegador) o undefined (en modo estricto)
obj.method(); // `this` será obj
new standardFunction(); // `this` será la nueva instancia
// Ejemplo de funciones flecha
const arrowFunction = () => {
console.log(this); // Hereda `this` del ámbito circundante (por ejemplo, Global o módulo)
// console.log(arguments); // Error, `arguments` no disponible
};
const outerObj = {
outerMethod: function() {
const innerArrowFunction = () => {
console.log(this); // Hereda `this` de outerMethod (que es outerObj)
};
innerArrowFunction();
}
};
arrowFunction(); // `this` será window (en navegador) o {} (en Node.js)
outerObj.outerMethod(); // `this` dentro de innerArrowFunction será outerObj
// Retorno implícito en función flecha
const sum = (a, b) => a + b;
console.log(sum(2, 3)); // 5
// Función normal con retorno explícito
function multiply(a, b) {
return a * b;
}
console.log(multiply(2, 3)); // 6
// La función flecha no puede ser constructora
// new arrowFunction(); // Error: TypeError: arrowFunction_1 is not a constructor