Ist es nicht möglich, diese Funktion von myObj.method(arg)
stattdessen zu verwenden?
Ja, ist es in diesem speziellen Fall, aber es ist durchaus üblich, eine Funktion Verweis auf anderen Code muss passieren, und Funktionsreferenzen nicht (Standard) tragen eine besonderes this
in sie gebacken; this
wird eingestellt, indem Sie die Funktion aufrufen.
So zum Beispiel, wenn Sie myObj.method
als Event-Handler verwenden, wenn es aufgerufen wird, this
während des Anrufs beziehen sich nicht auf das Objekt myObj
bezieht.
hitch
behebt das durch Erstellen einer neuen Funktion, die, wenn sie aufgerufen wird, ruft Ihre Methode mit this
richtig eingestellt.
Es ist seit einiger Zeit datiert, ES5 (im Jahr 2009) eingeführt Function#bind
, die das gleiche tut. Aber das Dojo-Toolkit wurde ursprünglich im Jahr 2005 erstellt und enthielt daher solche Dienstprogramme. Hier ist das gleiche Code Function#bind
statt:
require(["dojo/_base/lang"], function(lang){
var myObj = {
foo: "bar",
method: function(someArg){
console.log(this.foo);
}
};
var func = myObj.method.bind(myObj);
func();
});
Hier ist ein anschauliches Beispiel demonstriert, wie es in einem Event-Handler Rolle kann:
var obj = {
foo: "bar",
method: function() {
console.log("this.foo = " + this.foo);
}
};
document.getElementById("unbound").addEventListener("click", obj.method, false);
document.getElementById("bound").addEventListener("click", obj.method.bind(obj), false);
<input type="button" id="unbound" value="Unbound">
<input type="button" id="bound" value="Bound">
Danke. Ich glaube, ich beginne zu verstehen. Ich bin neu in der JavaScript-Programmierung. Benötigen Sie solche Utilities aufgrund der Asynchronität von JavaScript? – Naci
@Naci: Nein. :-) Tatsächlich hat JavaScript * keine * asynchrone Natur. JavaScript, die Sprache, ist fast vollständig synchron. Der erste (und bisher einzige) asynchrone Aspekt wurde in ES2015 hinzugefügt (die Garantie, dass Callback zu 'then' oder' catch' auf einem Versprechen immer asynchron aufgerufen wird). * (Fortsetzung) * –
* (Fortsetzung) * JS wird jedoch häufig in * Umgebungen verwendet, die von asynchronem Verhalten dominiert werden: Browser und NodeJS. Aber das ist nicht der Grund für Utilities wie dieses, es ist nur eine Parallele. Zum Beispiel: Der Callback, den Sie "Array # sort" geben, ist synchron, aber wenn Sie eine Objektmethode dafür aufrufen möchten, benötigen Sie 'bind', aus dem gleichen Grund benötigen Sie es mit einem Event-Handler (der asynchron ist). –