¿Cuáles son las explicaciones intuitivas para las funciones de vinculación, aplicación y llamada de Javascript?

Los 3 métodos le permiten establecer el contexto (esto) y proporcionar argumentos a las funciones.

Use .bind () cuando desee que esa función se llame más tarde con un determinado contexto, útil en eventos. .bind () devolverá una función que luego podrá invocar. Ya tendrá su contexto establecido, así como algunos o todos sus argumentos.

  función saludar (género, edad, nombre) {
	 // si es hombre, use Sr., de lo contrario use Sra.
 	 saludo var = género === "hombre"?  "Sr Sra. ";

 	 si (edad> 25) {
 		 devuelve "Hola", + saludo + nombre + ".";
 	 } más {
 		 devuelve "Hey", + nombre + ".";
 	 }
  }

 var greetAnAdultMale = greet.bind (nulo, "masculino", 45);
 GreetAnAdultMale ("John Hartlove");  // "Hola, señor John Hartlove".

 var greetAYoungster = greet.bind (nulo, "", 16);
 greetAYoungster ("Alex");  // "Hola, Alex".
 greetAYoungster ("Emma Waterloo");  // "Hola, Emma Waterloo".

El código anterior muestra cómo puede curry una función, también conocida como aplicación de función parcial , es el uso de una función (que acepta uno o más argumentos) que devuelve una nueva función con algunos de los argumentos ya establecidos. La función que se devuelve tiene acceso a los argumentos y variables almacenados de la función externa.

Use .call () o .apply () cuando desee invocar la función de inmediato, y modifique el contexto. La diferencia entre .call () y .apply () es la forma en que les pasa los parámetros. . apply () nos permite ejecutar una función con una matriz de parámetros, de modo que cada parámetro se pasa a la función individualmente cuando se ejecuta la función, ideal para funciones variadas ; una función variadica toma un número variable de argumentos, no un número establecido de argumentos como lo hacen la mayoría de las funciones.

  var clientData = {
 	 id: 094545
 	 fullName: "No establecido",
 	 // setUserName es un método en el objeto clientData
 	 setUserName: function (firstName, lastName) {
 		 // esto se refiere a la propiedad fullName en este objeto
 		 this.fullName = firstName + "" + lastName;
 	 }
 }

 función getUserInput (firstName, lastName, callback, callbackObj) {
	 // El siguiente método de aplicación establecerá el valor "this" en callbackObj
 	 callback.apply (callbackObj, [nombre, apellido]);
 }

El método Apply establece este valor en callbackObj. Esto nos permite ejecutar la función de devolución de llamada con este valor establecido explícitamente, por lo que los parámetros pasados ​​a la función de devolución de llamada se establecerán en el objeto clientData:

  // El método Apply utilizará el objeto clientData para establecer el valor "this"
 getUserInput ("Barack", "Obama", clientData.setUserName, clientData);
 // la propiedad fullName en clientData se configuró correctamente
 console.log (clientData.fullName);  // Barack Obama

Fuentes:

Los métodos de aplicación, llamada y enlace de JavaScript son esenciales para los profesionales de JavaScript

¿Javascript call () y apply () vs bind ()?

Tanto call como apply llaman a una función con cierto valor y argumentos. La diferencia entre estos dos es el hecho de que apply toma una lista de argumentos como segundo argumento y call recibe argumentos por separado. Por otro lado, bind devuelve una nueva función (que no se puede volver a vincular) que siempre tendrá los argumentos especificados, así como los proporcionados.

Function.prototype.bind ()

Function.prototype.call ()

Function.prototype.apply ()

Ok … son funciones muy simples siempre que sepas el mecanismo de this en JS. Entonces, para recordar cómo funciona this en JS, puede ir y leer la respuesta del usuario de Quora a ¿Cómo funciona JavaScript (esto)?

Entonces, bind , apply y call son tres funciones JS inventadas para efectuar directamente this valor en una función.

Podemos ubicarlos en dos categorías.

  • bind se aplica a una definición de función para cambiar el valor de esta función cada vez que se ejecuta.
  función saludar (msg) {
   devuelve `$ {msg} $ {this.name}`;
 }

 var o = {nombre: "Deniz"},
     p = {nombre: "Metin"},
     gno = greet.bind (o), // no estamos invocando saludar aquí
     gnp = saludar.bind (p);  // no estamos invocando saludar aquí

 console.log (gno ("Hola"));  // Hola Deniz
 console.log (gnp ("Sssup"));  // Sssup Metin
  • apply y call se utilizan para invocar una función (en el momento de la ejecución) con this valor dado.
  función saludar (msg) {
   devuelve `$ {msg} $ {http://this.name}`;
 }

 var o = {nombre: "Deniz"},
     p = {nombre: "Metin"},
 console.log (greet.call (o, "Hola"));  // Hola Deniz
 console.log (greet.apply (p, ["Sssap"]));  // Sssup Metin

Entonces, como puede notar, la diferencia principal entre call y apply es la forma en que se pasan los argumentos. En ambos, el argumento inicial es el valor this para ser usado dentro de la función. En cuanto a los argumentos restantes, call toma uno por uno, mientras que apply toma en una matriz.

apply pasando los argumentos en una matriz ha encontrado muchos casos de uso hack en el pasado como myFunc.apply(null, [1,2,3,4,5]) para pasar una matriz de elementos como argumentos a una función. Sin embargo, dado que ahora tenemos los operadores de spread/rest , esta es una práctica totalmente redundante. Simplemente haz como myFunc(…[1,2,3,4,5]) lugar.