Différence entre bind, apply and call method?

Je cherchais dans stackoverflow et le Web, ne pouvais pas obtenir des résultats appropriés ou une différence d'emplacement d'explication entre ces trois méthodes.

Dans la mesure où je comprends, ils font tous la même chose que l'exécution de la function/method in different context.

 var google = { makeBeer : function(arg1,arg2){ alert([arg1, arg2]); } } google.makeBeer('water','soda'); 

C'est ma fonction normale de l'objet google. Maintenant, lorsque j'utilise la méthode call and bind ici, voici la sortie.

 var google = { makeBeer: function (arg1, arg2) { alert([arg1, arg2]); } } google.makeBeer('water', 'soda'); function yahoo() {} var yah = new yahoo(); google.makeBeer.call(yah, 'pepsi', 'coke'); function msn() { } var msn = new msn(); google.makeBeer.call(msn, 'sprite', 'limca'); 

Je ne vois toujours pas un but de faire cela, je peux aller en avant et appeler google.makeBeer three times with different arguments.

Quelqu'un peut-il m'expliquer davantage sur cela?

apply et call sont la même chose sauf qu'on accepte les arguments à transmettre à la fonction en forme de tableau l'autre sous forme de paramètre.

bind fait la même chose que l' call ou l' apply fonction du cadre que vous utilisez, mais n'appelle pas la fonction tout de suite, elle renvoie une nouvelle fonction avec vos paramètres liés à this et lorsque la fonction est appelée à partir d'une nouvelle portée ou contexte, this restera tout ce que vous lieriez. La liaison vous permet également d'empêcher vos constructeurs d'être "piratés" par apply ou call car il utilisera toujours les paramètres liés pour this peu importe ce que quelqu'un envoie pour tenter de le remplacer par un call ou une apply .

Voici un exemple:

 function Profile(u) { this.user = u; this.getUser = function () { return this.user; }; } function Profile2(u) { this.user = u; this.getUser = (function () { return this.user; }); } function Profile3(u) { this.user = u; this.getUser = (function () { return this.user; }); } var x = new Profile('guest'); var x2 = new Profile2('guest'); var x3 = new Profile3('guest'); alert(x.getUser.apply({ user: 'Vinoth' })); // Vinoth alert(x2.getUser.call({ user: 'Babu' })); // babu alert(x3.getUser.bind(x3).call({ user: 'Nandan' })); // Guest 

bind crée une nouvelle fonction avec le même corps de fonction puis renvoie la nouvelle fonction
call appelle la même fonction dans un contexte passé différent et les paramètres doivent être explicitement écrits appellent les appels de la même fonction dans un autre contexte passé mais les paramètres doivent être transmis dans un tableau

Var f = function (p1, p2) {var s = this; }

 var newFunc = f.bind(window, 1, 2); //here newFunc is a function which when you will call will have this as window and p1 = 1 and p2 = 2 f.call(window, 1 , 2); //by executing this line this = window p1 = 1 and p2 = 2 f.call(document, 2, 3); //by executing this line this = document p1 = 2 and p2 = 3 f.apply(window,[1,2]); //by executing this line this = window p1 = 1 and p2 = 2 

En disant simplement qu'il n'y a pas de différence entre appliquer () et appel () seulement différent entre eux, c'est l'argument que vous passez. Dans appliquer (), vous devez passer l'argument en tant que tableau dans lequel, dans la méthode call (), vous passez les arguments sous forme de virgule séparée .

En parlant de la méthode bind, c'est la nouvelle méthode introduite dans EcmaScript5 et spécialement utilisée pour résoudre this portée en appelant la méthode des objets. this est particulièrement utile dans l'invocation de la méthode asynchrone.