Ya lo sé apply
y call
son funciones similares que establecen this
(contexto de una función).
La diferencia está en la forma en que enviamos los argumentos (manual vs matriz)
Pregunta:
¿Pero cuándo debo usar el bind()
método?
var obj = {
x: 81,
getX: function() {
return this.x;
}
};
alert(obj.getX.bind(obj)());
alert(obj.getX.call(obj));
alert(obj.getX.apply(obj));
javascript
arrays
function
Royi Namir
fuente
fuente
call()
usted pasa argumentos individualmente yapply()
como una matriz de argumentos. Para obtener más detalles, consulte la documentación vinculada que debería poder responder completamente a su pregunta.kind of weird there is not an existing question about this :
Con respecto a ese. Probablemente se deba a quebind()
se agregó después de que los otros dos ya existían en JavaScript 1.8.5 - ECMA-262, 5a edición. Mientrascall()
yapply()
han existido desde JavaScript 1.3 - ECMA-262 3rd Edition. SO tiene preguntas sobre ellos como: ¿cuál es la diferencia entre llamar y aplicar ? Sin embargo, solo estoy adivinando ya que me preguntaba eso.Respuestas:
Creé esta comparación entre objetos de función, llamadas de función
call/apply
y hacebind
un tiempo:.bind
le permite establecer elthis
valor ahora mientras le permite ejecutar la función en el futuro , ya que devuelve un nuevo objeto de función.fuente
Úselo
.bind()
cuando desee que esa función se llame más tarde con un determinado contexto, útil en eventos. Use.call()
o.apply()
cuando desee invocar la función inmediatamente y modifique el contexto.Llamar / aplicar llama a la función de inmediato, mientras que
bind
devuelve una función que, cuando se ejecute más tarde, tendrá el contexto correcto establecido para llamar a la función original. De esta manera, puede mantener el contexto en devoluciones de llamada y eventos asíncronos.Lo hago mucho:
Lo uso ampliamente en Node.js para devoluciones de llamada asíncronas para las que quiero pasar un método de miembro, pero todavía quiero que el contexto sea la instancia que inició la acción asíncrona.
Una implementación simple e ingenua de bind sería como:
Hay más (como pasar otros argumentos), pero puede leer más al respecto y ver la implementación real en el MDN .
Espero que esto ayude.
fuente
bind
vuelve.Todos adjuntan esto a la función (u objeto) y la diferencia está en la invocación de la función (ver más abajo).
La llamada adjunta esto a la función y ejecuta la función inmediatamente:
bind asocia esto a la función y debe invocarse por separado de esta manera:
o así:
apply es similar a call, excepto que toma un objeto tipo matriz en lugar de enumerar los argumentos uno por uno:
fuente
"use strict"
para evitar anular tales palabras clave reservadas. +1.Ejemplos de aplicación vs. llamada vs. enlace
Llamada
Aplicar
Enlazar
Cuándo usar cada uno
Llamar y aplicar son bastante intercambiables. Simplemente decida si es más fácil enviar una matriz o una lista de argumentos separados por comas.
Siempre recuerdo cuál es cuál al recordar que Call es para coma (lista separada) y Apply es para Array.
Bind es un poco diferente. Devuelve una nueva función. Llamar y Aplicar ejecutan la función actual inmediatamente.
Bind es genial para muchas cosas. Podemos usarlo para curry funciones como en el ejemplo anterior. Podemos tomar una función hello simple y convertirla en helloJon o helloKelly. También podemos usarlo para eventos como onClick donde no sabemos cuándo serán despedidos, pero sabemos qué contexto queremos que tengan.
Referencia: codeplanet.io
fuente
call
yapply
, ¿se sigue que si no tienes unthis
método dentro del método, entonces asignarías el primer argumento como anull
?var person1 = {firstName: 'Jon', lastName: 'Kuperman'}; function say(greeting) { console.log(greeting + ' ' + this.firstName + ' ' + this.lastName); } say.apply(person1, ['Hello']); // Hello Jon Kuperman
Funciona perfectamente bien y produce VM128: 4 Hola Jon KupermanPermite establecer el valor para
this
independiente de cómo se llama la función. Esto es muy útil cuando se trabaja con devoluciones de llamada:Para lograr el mismo resultado con
call
se vería así:fuente
.bind()
que has mostrado antes es incorrecto. Cuando usefn.bind(obj)
otra función, se le devolverá (no es que haya creado antes). Y no hay habilidades para cambiar el valor delthis
interior de labinded
función. Principalmente esto se utiliza para elthis
seguro de devolución de llamada . Pero en el tuyo, no hay diferencias en el resultado. Perofn !== fn.bind(obj);
ten en cuenta eso.Supongamos que tenemos
multiplication
funciónVamos a crear algunas funciones estándar usando
bind
var multiby2 = multiplication.bind(this,2);
Ahora multiby2 (b) es igual a multiplicación (2, b);
¿Qué pasa si paso ambos parámetros en bind?
Ahora getSixAlways () es igual a la multiplicación (3,2);
incluso pasar parámetro devuelve 6;
getSixAlways(12); //6
Esto crea una nueva función de multiplicación y la asigna a magicMultiplication.
Oh no, estamos ocultando la funcionalidad de multiplicación en magicMultiplication.
llamando
magicMultiplication
devuelve un espacio en blancofunction b()
en la ejecución funciona bien
magicMultiplication(6,5); //30
¿Qué tal llamar y aplicar?
magicMultiplication.call(this,3,2); //6
magicMultiplication.apply(this,[5,2]); //10
En palabras simples,
bind
crea la funcióncall
yapply
ejecuta la función mientrasapply
espera los parámetros en la matrizfuente
bind
crea la funcióncall
yapply
ejecuta la función mientrasapply
espera los parámetros en la matriz"Ambos
Function.prototype.call()
yFunction.prototype.apply()
llaman a una función con unthis
valor dado , y devuelven el valor de retorno de esa función.Function.prototype.bind()
, por otro lado, crea una nueva función con unthis
valor dado y devuelve esa función sin ejecutarla.Entonces, tomemos una función que se vea así:
Ahora, tomemos un objeto que se vea así:
Podemos vincular nuestra función a nuestro objeto de esta manera:
Ahora, podemos ejecutar
Obj.log
en cualquier parte de nuestro código:Donde realmente se pone interesante, es cuando no solo se vincula un valor para
this
, sino también para su argumentoprop
:Ahora podemos hacer esto:
fuente
enlace : enlaza la función con el valor y el contexto proporcionados, pero no ejecuta la función. Para ejecutar la función, debe llamar a la función.
llamada : ejecuta la función con el contexto y el parámetro proporcionados.
apply : ejecuta la función con el contexto y el parámetro proporcionados como matriz .
fuente
He aquí un buen artículo para ilustrar la diferencia entre
bind()
,apply()
ycall()
, resumir de la siguiente manera.bind()
nos permite establecer fácilmente qué objeto específico estará vinculado a esto cuando se invoque una función o método.bind()
permítanos tomar prestados métodosUn problema con este ejemplo es que estamos agregando un nuevo método
showData
en elcars
objeto y es posible que no queramos hacerlo solo para tomar prestado un método porque el objeto de los automóviles ya puede tener una propiedad o un nombre de métodoshowData
. No queremos sobrescribirlo accidentalmente. Como veremos en nuestra discusión sobreApply
y aCall
continuación, es mejor tomar prestado un método usando el métodoApply
oCall
.bind()
permítanos curry una funciónLa función Curry , 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.
Podemos usar
bind()
para curry estagreet
funciónapply()
ocall()
para establecer este valorEl
apply
,call
ybind
los métodos se usan para establecer el valor de esta cuando se invoca un método, y lo hacen de manera ligeramente diferente para permitir el uso de control directo y la versatilidad de nuestro código JavaScript.Los métodos
apply
ycall
son casi idénticos al establecer este valor, excepto que pasa los parámetros de la funciónapply ()
como una matriz , mientras que debe enumerar los parámetros individualmente para pasarlos alcall ()
método.Aquí hay un ejemplo para usar
call
oapply
configurar esto en la función de devolución de llamada.Prestar funciones con
apply
ocall
Métodos de préstamos de matriz
Creemos un
array-like
objeto y tomemos prestados algunos métodos de matriz para operar en nuestro objeto tipo matriz.Otro caso común es que convertir
arguments
a matriz de la siguiente maneraPedir prestado otros métodos
Se usa
apply()
para ejecutar la función de aridad variableEl
Math.max
es un ejemplo de función de aridad variable,Pero, ¿qué pasa si tenemos una serie de números para pasar
Math.max
? No podemos hacer esto:Aquí es donde el
apply ()
método nos ayuda a ejecutar funciones variadas . En lugar de lo anterior, tenemos que pasar la matriz de números usandoapply (
) así:fuente
llamar / aplicar ejecuta la función inmediatamente:
bind no ejecuta la función inmediatamente, pero devuelve la función de aplicación ajustada (para su posterior ejecución):
fuente
Sintaxis
aquí
fuente
La diferencia básica entre Call, Apply y Bind son:
Bind se usará si desea que su contexto de ejecución aparezca más adelante en la imagen.
Ex:
Digamos que quiero usar este método en alguna otra variable
Para usar la referencia de coche en alguna otra variable, debe usar
Hablemos sobre el uso más extenso de la función de enlace
¿Por qué? Debido a que ahora func es bind con el Número 1, si no usamos bind en ese caso, apuntará a Global Object.
Llamar, Aplicar se utilizan cuando desea ejecutar la declaración al mismo tiempo.
fuente
Llame aplicar y obligar. y cómo son diferentes.
Aprendamos a llamar y aplicar usando cualquier terminología diaria.
Tienes tres automóviles
your_scooter , your_car and your_jet
que comienzan con el mismo mecanismo (método). Creamos un objetoautomobile
con un métodopush_button_engineStart
.Vamos a entender cuándo se utiliza llamar y aplicar. Supongamos que usted es un ingeniero y lo tiene
your_scooter
,your_car
yyour_jet
que no venía con un botón de arranque de botón y desea utilizar un terceropush_button_engineStart
.Si ejecuta las siguientes líneas de código, darán un error. ¿POR QUÉ?
Por lo tanto, el ejemplo anterior le da a your_scooter, your_car, your_jet una característica del objeto del automóvil.
Vamos a profundizar Aquí dividiremos la línea de código anterior.
automobile.push_button_engineStart
nos está ayudando a obtener el método utilizado.Además, utilizamos apply o call utilizando la notación de puntos.
automobile.push_button_engineStart.apply()
Ahora aplique y llame a aceptar dos parámetros.
Así que aquí establecemos el contexto en la línea final de código.
automobile.push_button_engineStart.apply(your_scooter,[20])
La diferencia entre call y apply es solo que apply acepta parámetros en forma de matriz, mientras que call simplemente puede aceptar una lista de argumentos separados por comas.
¿Qué es la función JS Bind?
Una función de vinculación es básicamente la que vincula el contexto de algo y luego lo almacena en una variable para su ejecución en una etapa posterior.
Hagamos que nuestro ejemplo anterior sea aún mejor. Anteriormente utilizamos un método que pertenece al objeto del automóvil y lo utilizamos para equipar
your_car, your_jet and your_scooter
. Ahora imaginemos que queremos dar un separado porpush_button_engineStart
separado para arrancar nuestros automóviles individualmente en cualquier etapa posterior de la ejecución que deseamos.todavía no satisfecho?
Dejémoslo claro como lágrima. Hora de experimentar. Volveremos a llamar y aplicar la aplicación de función e intentaremos almacenar el valor de la función como referencia.
El siguiente experimento falla porque invocar y aplicar se invoca de inmediato, por lo tanto, nunca llegamos a la etapa de almacenar una referencia en una variable que es donde la función de vinculación roba el espectáculo
var test_function = automobile.push_button_engineStart.apply(your_scooter);
fuente
Llamada: la llamada invoca la función y le permite pasar argumentos uno por uno
Aplicar: Aplicar invoca la función y le permite pasar argumentos como una matriz
Bind: Bind devuelve una nueva función, permitiéndole pasar esta matriz y cualquier número de argumentos.
fuente
call (): - Aquí pasamos los argumentos de la función individualmente, no en un formato de matriz
apply (): - Aquí pasamos los argumentos de la función en un formato de matriz
bind (): -
fuente
Llamada de JavaScript ()
Aplicar JavaScript ()
** la función call y apply son llamadas de diferencia, toma un argumento separado pero aplica una matriz take como: [1,2,3] **
Enlace de JavaScript ()
fuente
Imagina, bind no está disponible. puedes construirlo fácilmente de la siguiente manera:
fuente
fuente
El concepto principal detrás de todos estos métodos es la excavación de funciones .
El préstamo de funciones nos permite usar los métodos de un objeto en un objeto diferente sin tener que hacer una copia de ese método y mantenerlo en dos lugares separados. Se logra mediante el uso de. llamada() , . aplicar (), o. bind (), todos los cuales existen para establecer explícitamente esto en el método que estamos tomando prestado
A continuación se muestra un ejemplo de todos estos métodos.
LLAMADA
APLICAR
ENLAZAR
printMyNAme () es la función que invoca la función
a continuación se muestra el enlace para jsfiddle
https://codepen.io/Arham11/pen/vYNqExp
fuente
Creo que los mismos lugares son: todos pueden cambiar el valor de esta función. Las diferencias son: la función de enlace devolverá una nueva función como resultado; los métodos call y apply ejecutarán la función de inmediato, pero apply puede aceptar una matriz como params, y analizará la matriz por separado. Y también, la función de vinculación puede ser Curry.
fuente
la función de vinculación debe usarse cuando queremos asignar una función con un contexto particular para, por ejemplo,
en el ejemplo anterior si llamamos a la función demo.setValue () y pasamos la función this.getValue directamente, entonces no llama a la función demo.setValue directamente porque esto en setTimeout se refiere al objeto de ventana, por lo que debemos pasar el contexto del objeto de demostración a this.getValue función usando bind. significa que solo pasamos la función con el contexto del objeto de demostración que no llama realmente a la función.
Espero que entiendas .
para obtener más información, consulte la función de enlace de javascript saber en detalle
fuente