Die JavaScript -Syntax ist flexibel und es ist nicht ungewöhnlich, dass fünf oder sechs Implementierungsmethoden für dieselbe Funktion vorhanden sind. Dann ist es noch verwirrender. Ich verstehe den Unterschied zwischen Anruf und Bewerbung oft nicht, daher werde ich ihn heute aufzeichnen, um es zu vermeiden, ihn wieder zu vergessen.
In JavaScript können Methoden auf folgende Weise ausgeführt werden:
1.Func () ist die direkteste und häufigste Art der Anrufe, und es entspricht auch der Denklogik gewöhnlicher Personen, aber in einigen Fällen gibt es einige Mängel, die unten erklärt werden.
2. (Funktion (arg) {}) (Fenster), ein anonymer Methode -Aufruf, ist bei der Erstellung eines Namespace nützlicher. Die Parameter in den folgenden Klammern entsprechen den eingehenden Parametern in der anonymen Methode eins nacheinander.
3.func.bind (sth) (). Das Mozilla-Handbuch erwähnt, dass Bind eine neue Funktion in der ECMA-262 5. Ausgabe ist. Es ist separat als Aufrufmethode aufgeführt, da es den Defekt ausgibt, dass der Umfang in direkten Aufrufen nicht gebunden werden kann.
4.Func.call (), dies ist die zweite Art der Anrufe. Jede Methode hat im Prototyp eine Aufrufmethode, um die aktuelle Methode auszuführen.
5.func.apply (), Call's Twin Brother.
func ()
Dies ist die häufigste Art der Berufung und ist überall in jeder Sprache zu sehen. Func (x, y) kann verschiedene Parameter übergeben. In einigen Sprachen wie PHP, Java, reicht diese Art von Aufruf aus, um alle Probleme zu lösen. JavaScript ist jedoch eine funktionale Sprache und das Konzept der Verschlüsse und ein seltsames Schlüsselwort. Dabei bestimmt dies die Mängel dieser Anrufe. Dies sollte als Umfang des aktuellen Codesegments interpretiert werden, der sich ändert, wenn der Code auf verschiedene Fragmente ausgeführt wird. In einigen Fällen möchten wir jedoch nicht, dass dies geändert wird, z. B. Ereignisse, die an bestimmte DOMs gebunden sind. Wir möchten definitiv nicht, dass dies auf das Fensterobjekt übertragen wird, wenn sie aufgerufen werden, aber manchmal ist dies wahr, zum Beispiel den folgenden Code.
Die Codekopie lautet wie folgt:
var a = {};
var func = function (x) {
console.log (this);
};
a.onclick = function () {
var x = 100;
func (x);
};
a.onclick ();
Sie können sich einen als Link auf der Seite vorstellen. Da wir nur die definierte Methode an das Onclick -Ereignis binden wollen, anstatt sie sofort aufzurufen, und diese Methode hat einen Parameter, müssen wir sie mit einer anonymen Methode einbeziehen und an das Onclick -Ereignis von A weitergeben. Dies hat ein Problem. Dies im Func wird zum globalen Objektfenster, natürlich wollen wir das nicht. Zu diesem Zeitpunkt ist die Verwendung von Func () als Direktaufrufmethode nicht möglich. Daher müssen wir dies außerhalb von Func an die Func -Methode binden. Es gibt also eine Bindung, Anruf, Anwendung.
binden
Der Zweck von Bind ist sehr einfach und gibt dieselbe Methode zurück, die dieses Objekt bindet. Der obige Code kann den Zweck erreichen, dies an dem A -Objekt zu binden, indem eine Zeile geändert wird.
Die Codekopie lautet wie folgt:
var a = {};
var func = function (x) {
console.log (this);
};
a.onclick = function () {
var x = 100;
func.bind (this) (x); // Binden Sie hier
};
a.onclick ();
Auf diese Weise läuft dieses Onclick -Event nicht wie eine kopflose Fliege.
Rufen Sie an und bewerben Sie sich
Rufen Sie an und bewerben Sie sich zusammen über zusammen, weil sie so ähnlich sind. Sie alle unterstützen mehrere Parameter, und der erste Parameter ist dieses Objekt, an das gebunden ist, und der zweite Parameter ist ihr Unterschied. Call verwendet unabhängige Parameter als Aufrufparameter und angewendet ein Array als Aufrufparameter. Manchmal wollen wir dieses Objekt nicht ändern, aber wir wollen es künstlich an andere Objekte binden. Zu diesem Zeitpunkt sind anrufen und bewerben Sie sich sehr nützlich. (Es ist nicht so, dass Sie Bind nicht verwenden können, aber es scheint, dass Bind verspätet erscheint, sodass die Browserkompatibilität möglicherweise schlecht ist). Nehmen Sie eine Kastanie:
Die Codekopie lautet wie folgt:
a = {
func: function () {
this.x += 1;
},
x: 0
};
B = {
A: a,,
x: 20
};
für (var i = 0; i <10; i ++) {
Bafunc ();
}
console.log (ax);
console.log (bx);
Es gibt X in den obigen A- und B -Objekten. Wir hoffen, dass Func das entsprechende X auf gezielte Weise ändern kann, aber direkter Anruf kann X nur im Func -Bereich ändern, dh AX. Ändern Sie den Code, um den Zweck der Änderung von BX zu erreichen
Die Codekopie lautet wie folgt:
a = {
func: function () {
this.x += 1;
},
x: 0
};
B = {
A: a,,
x: 20
};
für (var i = 0; i <10; i ++) {
Bafunc.call (b); // Binden Sie dies an b
}
console.log (ax);
console.log (bx);
Diese Kastanie ist nicht gut aufgenommen und ist ein sehr verwirrender Code-Stil mit anwendbaren Szenarien, aber nicht überall verfügbar.