quelle est la différence entre "l'appel/appliquer" et "liaison" [dupliquer]
Cette question a déjà une réponse ici:
- JavaScript call () & apply () vs bind ()? 16 réponses
var obj = {
x: 81,
getX: function() {
console.log( this.x)
}
};
var getX = obj.getX.bind(obj);//use obj as 'this';
getX();//81
var getX = function(){
obj.getX.apply(obj);
}
getX();//also 81
L'utilisation de bind et call / apply semble très similaire, je veux savoir quelle est la différence entre eux.Les deux fonctions GETX ci-dessus sont les mêmes?
3 réponses
bind
retourne une fonction qui agiront comme la fonction d'origine, mais avec this
prédéfinis. Il est généralement utilisé lorsque vous souhaitez passer une fonction à un gestionnaire d'événements ou à un autre rappel asynchrone.
call
et apply
appellera immédiatement une fonction vous permettant de spécifier à la fois la valeur de this
et tous les arguments que la fonction recevra.
Votre deuxième exemple définit une fonction anonyme qui appelle apply
. Ceci est un modèle commun; bind
fournit une implémentation standard de ce qui vous permet de le faire avec un simple appel de fonction (donc plus rapide et plus facile à écrire).
.call()
- appelle la même fonction avec les arguments spécifiés
.apply()
- appelle la même fonction avec les arguments spécifiés dans un tableau
.bind()
- crée une nouvelle fonction avec le même corps de la fonction, avec une valeur prédéfinie de this
(le premier argument) et retourne cette fonction.
Dans tous les cas, le premier argument est utilisé comme valeur de this
dans la fonction.
La différence est la façon dont vous faites l'appel. Si vous avez utilisé bind
pour récupérer une fonction avec une valeur liée this
, vous appelez simplement la fonction:
getx();
Si vous n'avez pas lié à la fonction, et vous voulez mettre this
, vous le faites avec call
ou apply
:
someFunction.call(objectToUseAsThis, arg1, arg2);
// or
someFunction.apply(objectToUseAsThis, [arg1, arg2]);
Notez que si vous avez une fonction liée (comme votre getX
), l'utilisation de call
est inutile, car le this
que vous fournissez sera simplement remplacé par le this
lié. (Utiliser apply
peut toujours être utile, si vous avez un tableau de valeurs que vous voulez cul comme arguments.)