quelle est la différence entre "l'appel/appliquer" et "liaison" [dupliquer]

Cette question a déjà une réponse ici:

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?

32
demandé sur bennyrice 2013-03-28 13:00:28

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).

37
répondu Quentin 2013-03-28 09:02:31

.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.

33
répondu techfoobar 2013-03-28 09:08:51

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.)

5
répondu T.J. Crowder 2013-03-28 12:23:29