Diferencias entre call, apply y bind
Como call, apply y bind controlan el valor de this y los argumentos al invocar funciones en JavaScript.
Las tres son metodos de Function.prototype que sirven para controlar de forma explicita el valor de this cuando invocas una funcion. La diferencia esta en cuando se ejecuta la funcion y como se pasan los argumentos.
Tabla comparativa
| Metodo | ¿Ejecuta? | Argumentos | Devuelve |
|---|---|---|---|
| call | Si, inmediatamente | Lista separada por comas | Resultado de la funcion |
| apply | Si, inmediatamente | Array unico | Resultado de la funcion |
| bind | No, devuelve nueva funcion | Lista separada por comas (parciales) | Funcion con this y args fijados |
Mismo ejemplo, tres formas
Mismo this, distintas invocaciones
javascriptfunction presentar(saludo, signo) {
return `${saludo}, soy ${this.nombre}${signo}`;
}
const ada = { nombre: 'Ada' };
presentar.call(ada, 'Hola', '!'); // 'Hola, soy Ada!'
presentar.apply(ada, ['Hola', '!']); // 'Hola, soy Ada!'
const presentarseAda = presentar.bind(ada, 'Hola');
presentarseAda('!'); // 'Hola, soy Ada!'Cuando usar cada uno
call: cuando tienes los argumentos uno a uno y quieres ejecutar la funcion en el acto. Util para invocar metodos con unthisdistinto sin crear una nueva funcion.apply: cuando los argumentos ya estan en un array. Antes era util para hacer spreading; hoy el operador...lo cubre mejor en la mayoria de casos.bind: cuando necesitas guardar una funcion lista para llamarse despues con unthisfijo, por ejemplo un callback o un event handler. Tambien sirve para aplicacion parcial de argumentos.
Caso practico: tomar prestados metodos
Array.prototype.slice es el truco clasico para convertir objetos array-like (como arguments o un NodeList antiguo) en arrays reales.
Method borrowing
javascriptfunction listar() {
return Array.prototype.slice.call(arguments);
}
listar(1, 2, 3); // [1, 2, 3]Caso practico: event handler con bind
bind para handlers
javascriptclass Contador {
constructor() {
this.valor = 0;
this.incrementar = this.incrementar.bind(this);
}
incrementar() {
this.valor += 1;
}
}
const c = new Contador();
boton.addEventListener('click', c.incrementar); // this seguira siendo cResumen
callyapplyinvocan la funcion;bindsolo crea una nueva.callrecibe argumentos sueltos;applyrecibe un array.- En codigo moderno,
bindsigue siendo el mas comun: los arrow functions o el operador spread suelen reemplazar acall/apply.