Quelle est la différence entre $.proxy() et bind()?

en 2009, ECMAScript 5 a ajouté une fonction intégrée bind() qui prend un objet comme paramètre et renvoie une fonction identique dans laquelle this se référera toujours à l'objet que vous avez passé. (Je n'ai rien trouvé qui ressemble à un lien de documentation canonique.)

en quoi est-ce différent de de jQuery $.proxy() fonction ? Est-ce que $.proxy() est arrivé en premier avant la sortie D'ECMAScript 5? Est-il un particulier raison de préférer $.proxy(function(){}, this) à function(){}.bind(this) ?

24
demandé sur stedman 2012-09-19 23:05:17

5 réponses

Modifier

s'il vous Plaît ne faites pas attention à ce post (en dépit d'être la accepté de répondre).

Bref, c'était de ma faute si j'ai fait des suppositions sur le contexte de la question, plutôt que de simplement regarder les documents de L'API, et j'ai été accepté comme réponse avant de réaliser ma propre stupidité (faire des suppositions, sans les valider) et de les supprimer.

la réponse de Matt Whipple est 100% correcte, et tandis que je en désaccord avec son affirmation que les mandataires réels sont inutiles dans JS (ils seraient fantastiques dans certaines préoccupations de bas niveau), le reste de ses déclarations sont tout à fait objectivement correctes (mis à part les dates réelles pour .bind vs .proxy , comme .bind était dans les années specifications avant qu'il a atterri uniformément dans les navigateurs).

ci-dessous est ma honte, dans les stocks pour tous voir...

n'hésitez pas à y jeter des tomates.

si vous voulez savoir pourquoi j'ai répondu comme je l'ai fait, lisez les commentaires ci-dessous.


la différence entre $({}).proxy() et func.bind({}) est que le mandataire est un lien lâche. Vous pouvez détacher à tout moment.

c'est à ça que servent les procurations. L'interface invisible entre ce que vous voulez faire et ce qui le fera réellement.

pour le dossier, il y a aussi un $.bind() qui n'est pas un proxy. C'est-à-dire qu'il se lie entièrement à this , de la même manière que func.bind() le fait, plutôt que de mettre en œuvre un système de médiateur pour attacher et détacher le contexte des fonctions à volonté.

9
répondu Norguard 2015-05-19 17:16:40

proxy est venu en premier et vous devriez probablement favoriser bind comme il est un standard. La façon dont ils sont appelés varie légèrement (en raison d'être attachés à Function.prototype vs étant juste une fonction) mais leur comportement est le même.

il y a un assez bon post ici: jQuery.proxy() usage , qui se termine avec ce conseil.

31
répondu Matt Whipple 2017-05-23 12:18:19

$.proxy est arrivé en premier. Ci-dessous est un moyen simple de préserver un contexte particulier sur appel de fonction

var myProxy = (function(context,fn){
  return function(){
      fn.call(context);
  }
})( myContext, myFn );

vous pourriez facilement utiliser ceci avant qu'il ne sorte jquery.

la réponse est simple: bind est l'officiel. Utilisez bind - si elle est vraiment prise en charge dans les navigateurs qui est nécessaire pour exécuter le script

7
répondu abuduba 2012-09-19 19:19:59

à Partir de trait de Soulignement lier vs jQuery.proxy vs Natif lier

en plus de ce qui est déjà mentionné, il y a une autre différence entre $.proxy() et .bind . Méthodes lié avec $.le proxy retournera la même référence s'il est appelé plusieurs fois; jQuery caches fonctions proxied à un objet.

jsFiddle

5
répondu Benny Bottema 2017-05-23 12:18:19

voici un test que vous pouvez essayer de comparer les performances.

http://jsperf.com/bind-vs-jquery-proxy/5

À cette époque, octobre 2014. La performance varie comme un fou entre les navigateurs. IE 11 native bind est le plus rapide.

Cependant, pour les trois navigateurs que j'ai testés, natif bind out préform jQuery proxy. Et puisque bind () est standard, je suggère de s'y tenir si possible.

1
répondu Morio 2014-10-08 18:32:06