Je le sais déjà apply
et ce call
sont des fonctions similaires qui se mettent en place this
(contexte d'une fonction).
La différence est avec la façon dont nous envoyons les arguments (manuel vs tableau)
Question:
Mais quand dois-je utiliser la bind()
méthode?
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
la source
la source
call()
vous passez des arguments individuellement etapply()
sous forme de tableau d'arguments. Pour plus de détails, consultez la documentation liée qui devrait être en mesure de répondre complètement à votre question.kind of weird there is not an existing question about this :
Le concernant. C'est probablement parce qu'il abind()
été ajouté après que les deux autres existaient déjà dans JavaScript 1.8.5 - ECMA-262, 5e édition. Bien quecall()
etapply()
ont été autour depuis JavaScript 1.3 - ECMA-262 3rd Edition. SO a des questions sur eux comme: quelle est la différence entre appeler et postuler . Je ne fais que deviner, car je me le demandais moi-même.Réponses:
J'ai créé cette comparaison entre les objets de fonction, les appels de fonction
call/apply
et il y abind
un certain temps:.bind
vous permet de définir lathis
valeur maintenant tout en vous permettant d'exécuter la fonction à l'avenir , car elle renvoie un nouvel objet fonction.la source
À utiliser
.bind()
lorsque vous souhaitez que cette fonction soit appelée ultérieurement avec un certain contexte, utile dans les événements. Utilisez.call()
ou.apply()
lorsque vous souhaitez appeler la fonction immédiatement et modifiez le contexte.Appeler / appliquer appelle immédiatement la fonction, tandis que
bind
renvoie une fonction qui, lorsqu'elle sera exécutée ultérieurement, aura le contexte correct défini pour appeler la fonction d'origine. De cette façon, vous pouvez maintenir le contexte dans les rappels et les événements asynchrones.Je le fais beaucoup:
Je l'utilise largement dans Node.js pour les rappels asynchrones pour lesquels je veux passer une méthode membre, mais je veux toujours que le contexte soit l'instance qui a lancé l'action asynchrone.
Une implémentation simple et naïve de bind serait comme:
Il y a plus à faire (comme passer d'autres arguments), mais vous pouvez en savoir plus à ce sujet et voir la véritable implémentation sur le MDN .
J'espère que cela t'aides.
la source
bind
revient.Ils attachent tous cela à la fonction (ou à l'objet) et la différence réside dans l'invocation de la fonction (voir ci-dessous).
l'appel attache ceci dans la fonction et exécute la fonction immédiatement:
bind attache ce en fonction et il doit être invoqué séparément comme ceci:
ou comme ça:
appliquer est similaire à appeler, sauf qu'il prend un objet de type tableau au lieu de répertorier les arguments un par un:
la source
"use strict"
pour éviter de remplacer ces mots-clés réservés. +1.Exemples d'application, d'appel et de liaison
Appel
Appliquer
Lier
Quand utiliser chacun
Appelez et postulez sont assez interchangeables. Décidez simplement s'il est plus facile d'envoyer un tableau ou une liste d'arguments séparés par des virgules.
Je me souviens toujours lequel est lequel en se rappelant que Call est pour une virgule (liste séparée) et Apply est pour Array.
Bind est un peu différent. Il renvoie une nouvelle fonction. Appel et application exécutent immédiatement la fonction actuelle.
La liaison est idéale pour beaucoup de choses. Nous pouvons l'utiliser pour curry des fonctions comme dans l'exemple ci-dessus. Nous pouvons prendre une simple fonction hello et la transformer en helloJon ou helloKelly. Nous pouvons également l'utiliser pour des événements comme onClick où nous ne savons pas quand ils seront renvoyés, mais nous savons quel contexte nous voulons qu'ils aient.
Référence: codeplanet.io
la source
call
etapply
, cela signifie-t-il que si vous ne disposez pas d'unthis
à l'intérieur de la méthode, vous affecteriez le premier argument en tant quenull
?var person1 = {firstName: 'Jon', lastName: 'Kuperman'}; function say(greeting) { console.log(greeting + ' ' + this.firstName + ' ' + this.lastName); } say.apply(person1, ['Hello']); // Hello Jon Kuperman
Fonctionne parfaitement bien et produit VM128: 4 Bonjour Jon KupermanIl permet de définir la valeur de
this
indépendamment de la façon dont la fonction est appelée. Ceci est très utile lorsque vous travaillez avec des rappels:Pour obtenir le même résultat avec,
call
cela ressemblerait à ceci:la source
.bind()
que vous avez montré auparavant est incorrecte. Lorsque vous utilisez unefn.bind(obj)
autre fonction sera retournée (pas celle que vous avez créée auparavant). Et il n'y a aucune capacité à changer la valeur de l'this
intérieur de labinded
fonction. Généralement, cela est utilisé pour l'this
assurance de rappel . Mais dans votre exemple - il n'y a aucune différence de résultat. Maisfn !== fn.bind(obj);
remarquez cela.Supposons que nous ayons une
multiplication
fonctionPermet de créer des fonctions standard en utilisant
bind
var multiby2 = multiplication.bind(this,2);
Maintenant multiby2 (b) est égal à multiplication (2, b);
Et si je passe les deux paramètres dans bind
Maintenant, getSixAlways () est égal à multiplication (3,2);
même le passage du paramètre renvoie 6;
getSixAlways(12); //6
Cela crée une nouvelle fonction de multiplication et l'affecte à magicMultiplication.
Oh non, nous cachons la fonctionnalité de multiplication dans magicMultiplication.
appeler
magicMultiplication
renvoie un blancfunction b()
à l'exécution, cela fonctionne bien
magicMultiplication(6,5); //30
Que diriez-vous d'appeler et d'appliquer?
magicMultiplication.call(this,3,2); //6
magicMultiplication.apply(this,[5,2]); //10
En termes simples,
bind
crée la fonctioncall
etapply
exécute la fonction alors qu'elleapply
attend les paramètres dans le tableaula source
bind
crée la fonctioncall
etapply
exécute la fonction alors qu'elleapply
attend les paramètres dans le tableau"Les deux
Function.prototype.call()
etFunction.prototype.apply()
appeler une fonction avec une donnée dethis
valeur et retourner la valeur de retour de cette fonction.Function.prototype.bind()
, d'autre part, crée une nouvelle fonction avec unethis
valeur donnée et renvoie cette fonction sans l'exécuter.Prenons donc une fonction qui ressemble à ceci:
Maintenant, prenons un objet qui ressemble à ceci:
Nous pouvons lier notre fonction à notre objet comme ceci:
Maintenant, nous pouvons exécuter
Obj.log
n'importe où dans notre code:Là où cela devient vraiment intéressant, c'est quand vous liez non seulement une valeur pour
this
, mais aussi pour son argumentprop
:Nous pouvons maintenant le faire:
la source
bind : il lie la fonction avec la valeur et le contexte fournis mais n'exécute pas la fonction. Pour exécuter la fonction, vous devez appeler la fonction.
appel : il exécute la fonction avec le contexte et le paramètre fournis.
apply : il exécute la fonction avec le contexte et les paramètres fournis sous forme de tableau .
la source
Voici un bon article pour illustrer la différence entre
bind()
,apply()
etcall()
, résumer comme ci - dessous.bind()
nous permet de définir facilement quel objet spécifique sera lié à cela lorsqu'une fonction ou une méthode est invoquée.bind()
nous permettent d'emprunter des méthodesUn problème avec cet exemple est que nous ajoutons une nouvelle méthode
showData
sur l'cars
objet et que nous ne voulons peut-être pas le faire uniquement pour emprunter une méthode car l'objet cars peut déjà avoir une propriété ou un nom de méthodeshowData
. Nous ne voulons pas l'écraser accidentellement. Comme nous le verrons dans notre discussion surApply
etCall
ci - dessous, il est préférable d'emprunter une méthode en utilisant la méthodeApply
ouCall
.bind()
nous permettent de curry une fonctionLe curry de fonction , également appelé application de fonction partielle , est l'utilisation d'une fonction (qui accepte un ou plusieurs arguments) qui renvoie une nouvelle fonction avec certains des arguments déjà définis.
Nous pouvons utiliser
bind()
pour curry cettegreet
fonctionapply()
oucall()
pour définir cette valeurLes
apply
,call
et lesbind
méthodes sont tous utilisés pour définir la valeur lors de l' appel de cette méthode, et ils le font de façon légèrement différente pour permettre l' utilisation de contrôle direct et la polyvalence dans notre code JavaScript.Les
apply
etcall
méthodes sont presque identiques lors de la définition de la cette valeur , sauf que vous passez les paramètres de fonctionapply ()
comme un tableau , alors que vous devez lister les paramètres individuellement pour les passer à lacall ()
méthode.Voici un exemple d'utiliser
call
ouapply
de régler ce dans la fonction de rappel.Emprunter des fonctions avec
apply
oucall
Emprunter des méthodes de tableau
Créons un
array-like
objet et empruntons quelques méthodes de tableau pour opérer sur notre objet de type tableau.Un autre cas courant est la conversion
arguments
en tableau comme suitEmprunter d'autres méthodes
Utiliser
apply()
pour exécuter la fonction d' arité variableC'est
Math.max
un exemple de fonction d'arité variable,Mais que se passe-t-il si nous avons un tableau de nombres à transmettre
Math.max
? Nous ne pouvons pas faire cela:C'est là que la
apply ()
méthode nous aide à exécuter des fonctions variadiques . Au lieu de ce qui précède, nous devons passer le tableau de nombres en utilisantapply (
) ainsi:la source
call / apply exécute la fonction immédiatement:
bind n'exécute pas la fonction immédiatement, mais retourne la fonction apply enveloppée (pour une exécution ultérieure):
la source
Syntaxe
Ici
la source
La différence fondamentale entre Call, Apply et Bind est:
Bind sera utilisé si vous souhaitez que votre contexte d'exécution apparaisse plus tard dans l'image.
Ex:
Disons que je veux utiliser cette méthode dans une autre variable
Pour utiliser la référence de voiture dans une autre variable, vous devez utiliser
Parlons d'une utilisation plus étendue de la fonction de liaison
Pourquoi? Parce que maintenant func est lié avec Number 1, si nous n'utilisons pas bind dans ce cas, il pointera sur Global Object.
Appel, Appliquer sont utilisés lorsque vous souhaitez exécuter l'instruction en même temps.
la source
Appelez appliquer et lier. et comment ils sont différents.
Permet d'apprendre à appeler et d'appliquer en utilisant n'importe quelle terminologie quotidienne.
Vous avez trois automobiles
your_scooter , your_car and your_jet
qui démarrent avec le même mécanisme (méthode). Nous avons créé un objetautomobile
avec une méthodepush_button_engineStart
.Permet de comprendre quand l'appel est appliqué et d'appliquer. Supposons que vous êtes ingénieur et que vous l'avez fait
your_scooter
,your_car
etyour_jet
que vous ne soyez pas venu avec un push_button_engine_start et que vous souhaitiez utiliser un tierspush_button_engineStart
.Si vous exécutez les lignes de code suivantes, elles donneront une erreur. POURQUOI?
Ainsi, l'exemple ci-dessus donne avec succès à votre_scooter, votre_voiture, votre_jet une caractéristique de l'objet automobile.
Approfondissons Ici, nous allons diviser la ligne de code ci-dessus.
automobile.push_button_engineStart
nous aide à utiliser la méthode.De plus, nous utilisons appliquer ou appeler en utilisant la notation par points.
automobile.push_button_engineStart.apply()
Maintenant, appliquez et appelez accepter deux paramètres.
Nous définissons donc ici le contexte dans la dernière ligne de code.
automobile.push_button_engineStart.apply(your_scooter,[20])
La différence entre l'appel et l'application est simplement que l'application accepte les paramètres sous la forme d'un tableau tandis que l'appel peut simplement accepter une liste d'arguments séparés par des virgules.
qu'est-ce que la fonction JS Bind?
Une fonction de liaison est fondamentalement qui lie le contexte de quelque chose et le stocke ensuite dans une variable pour une exécution ultérieure.
Rendons notre exemple précédent encore meilleur. Plus tôt, nous avons utilisé une méthode appartenant à l'objet automobile et l'avons utilisée pour équiper
your_car, your_jet and your_scooter
. Imaginons maintenant que nous voulons donner un séparépush_button_engineStart
séparément pour démarrer nos automobiles individuellement à tout stade ultérieur de l'exécution que nous souhaitons.toujours pas satisfait?
Disons-le clairement comme une larme. Il est temps d'expérimenter. Nous allons revenir pour appeler et appliquer l'application de la fonction et essayer de stocker la valeur de la fonction comme référence.
L'expérience ci-dessous échoue parce que call et apply sont invoqués immédiatement, par conséquent, nous n'atteignons jamais le stade de stockage d'une référence dans une variable qui est l'endroit où la fonction de liaison vole la vedette
var test_function = automobile.push_button_engineStart.apply(your_scooter);
la source
Appel: appel invoque la fonction et vous permet de passer des arguments un par un
Apply: Apply invoque la fonction et vous permet de passer des arguments sous forme de tableau
Bind: Bind renvoie une nouvelle fonction, vous permettant de transmettre un tableau this et un nombre quelconque d'arguments.
la source
call (): - Ici, nous passons les arguments de la fonction individuellement, pas dans un format de tableau
apply (): - Ici, nous passons les arguments de la fonction dans un format de tableau
lier() :--
la source
Appel JavaScript ()
JavaScript s'applique ()
** les fonctions call et apply sont des appels d'appel différentiels, mais un tableau take comme: [1,2,3] **
Liaison JavaScript ()
la source
Imaginez, la liaison n'est pas disponible. vous pouvez facilement le construire comme suit:
la source
la source
Le concept principal derrière toutes ces méthodes est la fouille de fonction .
L'emprunt de fonctions nous permet d'utiliser les méthodes d'un objet sur un objet différent sans avoir à faire une copie de cette méthode et à la conserver à deux endroits distincts. Il est accompli grâce à l'utilisation de. appel() , . appliquer (), ou. bind (), qui existent tous pour définir explicitement cela sur la méthode que nous empruntons
Voici un exemple de toutes ces méthodes
APPEL
APPLIQUER
LIER
printMyNAme () est la fonction qui appelle la fonction
ci-dessous est le lien pour jsfiddle
https://codepen.io/Arham11/pen/vYNqExp
la source
Je pense que les mêmes endroits sont: ils peuvent tous changer la valeur de cette fonction. Les différences sont: la fonction bind retournera une nouvelle fonction en conséquence; les méthodes call et apply exécuteront la fonction immédiatement, mais apply peut accepter un tableau en tant que paramètres, et il analysera le tableau séparément. De plus, la fonction de liaison peut être Currying.
la source
La fonction de liaison doit être utilisée lorsque nous voulons assigner une fonction avec un contexte particulier, par exemple.
dans l'exemple ci-dessus si nous appelons la fonction demo.setValue () et transmettons directement la fonction this.getValue, alors il n'appelle pas la fonction demo.setValue directement car cela dans setTimeout fait référence à l'objet fenêtre, nous devons donc passer le contexte de l'objet de démonstration à this.getValue fonction utilisant bind. cela signifie que nous ne transmettons que la fonction avec le contexte de l'objet de démonstration et non la fonction d'appel.
J'espère que tu comprends .
pour plus d'informations s'il vous plaît se référer à la fonction de liaison javascript connaître en détail
la source