Arrow functions en JavaScript: sintaxis, this y límites | Nicolás Garzón
Una arrow function es una forma de crear funciones mediante la sintaxis =>.
JavaScript
Copiar const add = ( first, second ) => {
return first + second;
} ; JavaScript
Copiar const greet = ( name ) => {
return ` Hello, ${ name} ` ;
} ; Cuando existe un solo parámetro, los paréntesis pueden omitirse.
JavaScript
Copiar const double = number => {
return number * 2 ;
} ; Mantenerlos puede dar consistencia y facilita añadir parámetros después.
JavaScript
Copiar const double = ( number ) => {
return number * 2 ;
} ; Sin parámetros se necesitan paréntesis.
JavaScript
Copiar const getCurrentDate = ( ) => {
return new Date ( ) ;
} ; Si el cuerpo contiene una sola expresión, pueden omitirse llaves y return.
JavaScript
Copiar const double = ( number ) => number * 2 ; Estas dos funciones son equivalentes:
JavaScript
Copiar const first = ( number ) => {
return number * 2 ;
} ;
const second = ( number ) => number * 2 ; El retorno implícito funciona con expresiones, no con sentencias.
JavaScript
Copiar const getLabel = ( isActive ) =>
isActive ? "Active" : "Inactive" ; Las llaves se interpretarían como el cuerpo de la función.
JavaScript
Copiar const createUser = ( name ) => {
name : name;
} ; La función anterior no devuelve el objeto esperado. Debe envolverse entre paréntesis.
JavaScript
Copiar const createUser = ( name ) => ( {
name,
} ) ; Los paréntesis indican que el objeto es una expresión que debe retornarse.
Son comunes cuando la función es corta y se utiliza cerca de la operación.
JavaScript
Copiar const activeProducts = products. filter (
( product ) => product. isActive,
) ; JavaScript
Copiar const names = users. map ( ( user ) => user. name) ; Una arrow function no vuelve automáticamente más claro el código. Si el callback contiene varias decisiones, un nombre separado puede expresar mejor la intención.
JavaScript
Copiar function canBePublished ( project ) {
return project. isComplete && ! project. hasErrors;
}
const publishableProjects = projects. filter ( canBePublished) ; Una arrow function no crea su propio this. Utiliza el this disponible en el scope exterior.
JavaScript
Copiar function Timer ( ) {
this . seconds = 0 ;
setInterval ( ( ) => {
this . seconds++ ;
} , 1000 ) ;
} La arrow function conserva el this de la llamada a Timer.
Una función normal obtiene this según cómo sea llamada.
JavaScript
Copiar const counter = {
value : 0 ,
increment ( ) {
this . value++ ;
} ,
} ; Usar una arrow como método puede ser incorrecto cuando se necesita el objeto receptor.
JavaScript
Copiar const counter = {
value : 0 ,
increment : ( ) => {
this . value++ ;
} ,
} ; Esa arrow no recibe counter como this; captura el this exterior.
El comportamiento completo se estudiará en la nota this .
JavaScript
Copiar function regularFunction ( ) {
console. log ( arguments) ;
} Una arrow function busca arguments en un scope exterior.
JavaScript
Copiar const arrowFunction = ( ) => {
console. log ( arguments) ;
} ; En un módulo, ese nombre puede ni siquiera existir.
Para recibir una cantidad variable de argumentos, usa rest parameters.
JavaScript
Copiar const sum = ( ... numbers) =>
numbers. reduce ( ( total, number ) => total + number, 0 ) ; JavaScript
Copiar const User = ( name ) => {
this . name = name;
} ;
new User ( "Nicolás" ) ; Las arrow functions no son constructoras y no tienen un prototype propio utilizable para construcción.
Cuando necesites crear instancias mediante new, utiliza una clase o una función constructora.
JavaScript
Copiar const showName = ( ) => this . name;
showName . call ( { name : "Nicolás" } ) ; call no reemplaza el this léxico de la arrow.
En una función normal sí puede establecerse el receptor.
JavaScript
Copiar function showName ( ) {
return this . name;
}
showName . call ( { name : "Nicolás" } ) ; JavaScript
Copiar const loadProducts = async ( ) => {
const response = await fetch ( "/api/products" ) ;
return response. json ( ) ;
} ; Sigue siendo una arrow function, pero devuelve una promesa por estar declarada con async.
Cuando una arrow devuelve una expresión larga, los saltos de línea y paréntesis ayudan a leerla.
JavaScript
Copiar const calculateLineTotal = ( { price, quantity, discount } ) => (
price * quantity * ( 1 - discount)
) ; Si la función necesita validaciones o varias etapas, un cuerpo con llaves suele ser más claro.
JavaScript
Copiar const calculateLineTotal = ( item ) => {
if ( item. quantity <= 0 ) {
return 0 ;
}
const subtotal = item. price * item. quantity;
return subtotal * ( 1 - item. discount) ;
} ; Suele encajar bien cuando:
Es un callback corto.
Debe conservar el this exterior.
Se almacena como una expresión.
Realiza una transformación pequeña y clara.
Una función normal suele ser mejor cuando:
Necesita un this dinámico.
Se utilizará como constructora.
Necesita su propio arguments.
Una declaración con nombre comunica mejor la operación principal.
Pensar que una arrow solo cambia la sintaxis.
Utilizarla como método cuando se necesita el objeto como this.
Intentar crear instancias con new.
Esperar que tenga su propio arguments.
Intentar cambiar su this con bind.
Olvidar los paréntesis al devolver un objeto literal.
Comprimir una función compleja hasta volverla difícil de leer.
Crear callbacks anónimos cuando un nombre expresaría mejor la intención.
Una arrow function se crea con =>.
Puede utilizar retorno implícito para una sola expresión.
Un objeto literal retornado implícitamente necesita paréntesis.
Captura this desde el scope exterior.
No tiene arguments propio.
No puede utilizarse como constructora.
call, apply y bind no reemplazan su this.
Es especialmente útil para callbacks y transformaciones pequeñas.
¿Por qué esta función no devuelve el objeto esperado?
JavaScript
Copiar const createProduct = ( name ) => {
name,
active : true ,
} ; Respuesta Las llaves se interpretan como el cuerpo de la función. Para retornar un objeto literal de forma implícita debe escribirse const createProduct = (name) => ({ name, active: true });.
Parámetros y argumentos explica cómo recibe información una función, qué ocurre con valores faltantes o adicionales y cómo diseñar una interfaz de llamada clara.