Translate

lunes, 16 de junio de 2025

Arrow Function vs Function en JavaScript


En JavaScript tenemos dos formas principales de declarar funciones:


// Function clásica

function sumar(a, b) {

  return a + b;

}


// Arrow function

const sumar = (a, b) => a + b;


Aunque pueden parecer equivalentes, tienen diferencias importantes:

this léxico:

  • Function clásica: el this depende de cómo se invoque la función.
  • Arrow function: el this se captura del contexto donde fue definida.


const obj = {

  numero: 42,

  funcionClasica: function() {

    console.log(this.numero);  // 42

  },

  arrowFunction: () => {

    console.log(this.numero);  // undefined (o distinto según el contexto externo)

  }

}


Las arrow functions no tienen su propio this.

Las arrow functions no tienen arguments:


function funcionClasica() {

  console.log(arguments);

}


const arrowFunction = () => {

  console.log(arguments); // ReferenceError

}


Si necesitas los argumentos en arrow function, podés usar parámetros rest (...args).


Las arrow functions no pueden ser constructores:


No podés hacer new sobre una arrow function.


function Persona() {}

const PersonaArrow = () => {};


new Persona(); // OK

new PersonaArrow(); // TypeError


Las arrow functions no tienen prototype:


console.log(Persona.prototype); // {}

console.log(PersonaArrow.prototype); // undefined


Las arrow functions tienen una sintaxis más compacta. Ideal para callbacks, funciones de orden superior o programación funcional:


const numeros = [1, 2, 3];

const dobles = numeros.map(n => n * 2);


Hoisting:

  • Las function declarations se elevan (hoisting).
  • Las arrow functions (al ser expresiones) no:


sumar(2,3); // OK

function sumar(a,b){ return a + b; }


sumarArrow(2,3); // TypeError: sumarArrow is not a function

const sumarArrow = (a,b) => a + b;


Mejor en callbacks, no siempre en métodos:


Por su manejo de this, las arrow functions suelen ser preferidas en callbacks, pero no tanto para métodos de objetos o clases.


Regla rápida: usa arrow functions cuando quieras mantener el this del contexto externo (sobre todo en callbacks). Usa functions clásicas cuando necesites un constructor, arguments, o una función completamente autónoma.