Ich habe mich in Bezug auf Dinge, die damit zusammenhängen, wie Anruf, Bewerbung usw., immer vage ausgedrückt. Dieses Mal habe ich eine schriftliche Testfrage zum Thema Bindung gesehen, daher habe ich diesen Artikel zur Erinnerung geschrieben.
Bind kann wie call und apply das ändern, auf das der Kontext zeigt. Der Unterschied besteht darin, dass sich call wie apply direkt auf die Methode bezieht, während bind nach dem Binden eine Methode zurückgibt, der interne Kern jedoch immer noch apply ist.
Schauen Sie sich direkt das Beispiel an:
var obj = {
a: 1,
b: 2,
getCount: function(c, d) {
Geben Sie this.a this.b c d;
zurück
}
};
window.a = window.b = 0;
console.log(obj.getCount(3, 4)); // 10
var func = obj.getCount;
console.log(func(3, 4)); // 7
Warum passiert das? Weil dies im Kontext von func window ist! Die Existenz von bind besteht darin, diesen Zeiger zu ändern, um den gewünschten Wert zu erhalten:
var obj = {
a: 1,
b: 2,
getCount: function(c, d) {
Geben Sie this.a this.b c d;
zurück
}
};
window.a = window.b = 0;
var func = obj.getCount.bind(obj);
console.log(func(3, 4)); // 10
Bind ist eine Funktionserweiterungsmethode der Funktion. Nach dem Binden bindet der Code diesen Zeiger (obj) innerhalb von func erneut, ist jedoch nicht mit ie6~8 kompatibel. Der kompatible Code lautet wie folgt:
var obj = {
a: 1,
b: 2,
getCount: function(c, d) {
Geben Sie this.a this.b c d;
zurück
}
};
Function.prototype.bind = Function.prototype.bind ||. function(context) {
var that = this;
return function() {
// console.log(arguments); // console [3,4] if ie<6-8>
Geben Sie that.apply(context, arguments);
zurück
}
}
window.a = window.b = 0;
var func = obj.getCount.bind(obj);
console.log(func(3, 4)); // 10
Tatsächlich besteht meiner Meinung nach der Kern von bind darin, eine nicht ausgeführte Methode zurückzugeben. Wenn Sie apply verwenden oder direkt aufrufen:
var ans = obj.getCount.apply(obj, [3, 4]);
console.log(ans); // 10
Es ist nicht möglich, den abgekürzten Funktionskonstruktor func zu verwenden. Verwenden Sie daher bind, um diesen Zeiger zu übergeben und dann eine nicht ausgeführte Methode zurückzugeben. Die Implementierung ist recht clever.