J'ai toujours été vague sur les choses liées à cela, comme appeler, postuler, etc. Cette fois, j'ai vu une question de test écrite liée à la liaison, j'ai donc écrit cet article comme rappel.
Bind, comme call et apply, peut changer le this indiqué par le contexte. La différence est que call, comme apply, fait directement référence à la méthode, tandis que bind renvoie une méthode après la liaison, mais le noyau interne est toujours apply.
Regardez directement l'exemple :
var obj = {
une : 1,
b : 2,
getCount : fonction(c, d) {
Renvoie this.a this.b c d;
>
};
fenêtre.a = fenêtre.b = 0;
console.log(obj.getCount(3, 4)); // 10
var func = obj.getCount;
console.log(func(3, 4)); // 7
Pourquoi cela se produit-il ? Parce que dans le contexte de func, c'est window ! L'existence de bind consiste à changer ce pointeur pour obtenir la valeur souhaitée :
var obj = {
une : 1,
b : 2,
getCount : fonction(c, d) {
Renvoie this.a this.b c d;
>
};
fenêtre.a = fenêtre.b = 0;
var func = obj.getCount.bind(obj);
console.log(func(3, 4)); // 10
Bind est une méthode d'extension de fonction. Après la liaison, le code relie le pointeur this (obj) à l'intérieur de func, mais il n'est pas compatible avec ie6~8. Le code compatible est le suivant :
.
var obj = {
une : 1,
b : 2,
getCount : fonction(c, d) {
Renvoie this.a this.b c d;
>
};
Function.prototype.bind = Function.prototype.bind || fonction (contexte) {
var ça = ceci;
return function() {
// console.log(arguments); // console [3,4] si c'est à dire<6-8>
Renvoie that.apply(context, arguments);
>
>
fenêtre.a = fenêtre.b = 0;
var func = obj.getCount.bind(obj);
console.log(func(3, 4)); // 10
En fait, à mon avis, le cœur de bind est de renvoyer une méthode non exécutée Si vous utilisez apply ou call directement :
var ans = obj.getCount.apply(obj, [3, 4]);
console.log(ans); // 10
Il est impossible d'utiliser le constructeur de fonction func abrégé, utilisez donc bind pour passer ce pointeur, puis renvoyez une méthode non exécutée. L'implémentation est assez intelligente.