como-funciona-call-apply-bind-en-javascript

Cómo funciona Call, Apply y Bind en JavaScript

Cuando trabajamos con JavaScript, es frecuente encontrarse con situaciones en las que necesitamos controlar el valor de this.

Aquí es donde entran en juego los métodos call(), apply() y bind(). Estos métodos nos permiten establecer explícitamente el contexto de this para una función

MétodoDescripciónEjecución
callEjecutar una función de inmediato con un contexto específico.Inmediata
applySimilar a call, pero cuando los argumentos están en un array.Inmediata
bindPara crear una nueva función con un contexto fijo.No inmediata

Estos métodos son muy útiles cuando queremos asegurarnos de que this apunte al objeto correcto, sin importar cómo se invoque la función (y que no se “pierda”).

Método call()

El método call() permite llamar una función con un valor específico de this y pasarle los argumentos uno por uno.

La sintaxis de de call() es la siguiente

functionName.call(thisArg, arg1, arg2, ...);
  • thisArg: El objeto que deseas asociar a this cuando se ejecute la función. Esto define el contexto.
  • arg1, arg2, …: Los argumentos que se pasan a la función, listados uno por uno.

Vamos a verlo con un ejemplo,

function saludar(saludo) {  
  console.log(`${saludo}, soy ${this.nombre}`);  
}  

const persona = { nombre: "Luis" };  

saludar.call(persona, "Hola");  // Salida: "Hola, soy Luis"  
  • La función saludar no tiene su propio objeto this.
  • Usamos call() para establecer el valor de this como el objeto persona.
  • Pasamos el argumento "Hola" directamente como un parámetro.

## Método apply()

El método apply() funciona de manera similar a call(), pero los argumentos se pasan como un array o lista.

La sintaxis de apply() es

functionName.apply(thisArg, [arg1, arg2, ...]);
  • thisArg: Igual que en call(), es el valor que se asignará a this.
  • [arg1, arg2, …]: Un array o un objeto iterable que contiene los argumentos para la función.

Que si lo vemos con un ejemplo podría ser,

function presentar(nombre, edad) {  
  console.log(`Me llamo ${nombre} y tengo ${edad} años. Soy ${this.profesion}`);  
}  

const contexto = { profesion: "desarrollador" };  

presentar.apply(contexto, ["Luis", 30]);  
// Salida: "Me llamo Luis y tengo 30 años. Soy desarrollador"  

apply() es útil cuando tienes los argumentos almacenados en un array o necesitas pasarlos dinámicamente.

## Método bind()

A diferencia de call() y apply(), el método bind() no ejecuta la función inmediatamente.

En su lugar, devuelve una nueva función con el valor de this vinculado al contexto especificado.

La sintaxis básica del método .bind() es la siguiente:

functionName.bind(thisArg[, arg1[, arg2[, ...]]]);
  • thisArg: El valor que se desea asociar a this cuando la función se ejecute. Esto define el contexto de la función.
  • arg1, arg2, ... (opcional): Argumentos que se pasan antes de los argumentos que la función original tomaría.
const persona = {  
  nombre: "Luis",  
  saludar: function() {  
    console.log(`Hola, soy ${this.nombre}`);  
  }  
};  

const saludo = persona.saludar.bind(persona);  
saludo();  // Salida: "Hola, soy Luis"  

Vamos a verlo con un ejemplo. bind() es útil para asegurar que this se mantenga fijo, incluso cuando la función se utiliza en otros contextos.

const objeto = {
    nombre: "Luis",
    saludar: function() {
        console.log(`Hola, mi nombre es ${this.nombre}`);
    }
};

const saludarLuis = objeto.saludar.bind(objeto);
saludarLuis(); // "Hola, mi nombre es Luis"

En este ejemplo,

  • Al usar bind, creamos una nueva función saludarLuis que siempre tendrá this apuntando al objeto objeto.
  • Esto garantiza que, al invocarla, el método saludar acceda correctamente a la propiedad nombre.

Ejemplos prácticos

Estos ejemplos muestran cómo funciona Call, Apply y Bind. No significa que siempre sean la mejor forma de resolver todos los problemas; en algunos casos, puede haber soluciones más adecuadas.