Ich arbeite an einem Projekt, das JS-Prototyping und jQuery verwendet.

Ich glaube, mein Problem ist, wie "dies" verwendet wird.

In meinem Code habe ich jQuery in einer Funktion, für die ich Prototypen erstellen werde. Die jQuery sieht folgendermaßen aus: (In diesem Code ist 'target' ein jQuery-Objekt, das beim ersten Erstellen von IMAGE_UPLOADER übergeben wird.)

document.getElementById(target.find('.file_selector').prop('id')).addEventListener("change", this.FileSelectHandler, false);

In diesem Ereignis-Listener gibt es eine Funktion namens FileSelectHandler. Diese Funktion wird gut aufgerufen. Innerhalb dieser Funktion wird jedoch eine zweite Funktion aufgerufen. Hier ist eine kurze Version der Funktion:

FILE_UPLOADER.prototype.FileSelectHandler = function(e) {

this.FileDragHover(e);
 }

Hier tritt der Fehler auf. JS beschwert sich, dass die Funktion 'FileDragHover' nicht existiert. Es existiert natürlich und ist wie folgt definiert:

FILE_UPLOADER.prototype.FileDragHover = function(e) {}

Ich hoffe, das sind genug Informationen, um das Problem zu verstehen. Wenn nicht, lassen Sie es mich bitte wissen und ich kann weitere hinzufügen.

0
Lee Loftiss 6 Dez. 2013 im 10:40

2 Antworten

Die Variable this bezieht sich auf das aufrufende Objekt und nicht auf das Objekt, für das die Methode deklariert ist. Wenn ich also someObject.someFunction(); habe, ist someObject das aufrufende Objekt und der Wert von this in der Funktion.

Demonstrieren:

var obj1 = {
  name:"obj1",
  say:function(){
    console.log(this.name);
  }
};
var obj2 = {name:"obj2"};
obj2.say = obj1.say;
obj2.say()//logs obj2

Im obigen Code wurde say auf obj1 deklariert, aber von obj2 aufgerufen.

Mehr zu diesem Wert, den Konstruktorfunktionen und dem Prototyp hier.

0
Community 23 Mai 2017 im 10:32

Wenn ein Objekt obj eine Funktion func hat und Sie obj.func() ausführen, wird die Funktion im Kontext von obj aufgerufen, wobei this in dieser Funktion auf {{verweist X5}}.

Wenn Sie jedoch so etwas tun:

var callback = obj.func;
callback();

Dann wird callback im Kontext von obj nicht mehr aufgerufen. Für Browser lautet der Kontext dann window. Dies geschieht, wenn Sie die Funktion als Rückruf an addEventListener übergeben. Abhängig davon, wie Ihr Rückruf verwendet wird, kann er in einem anderen Kontext aufgerufen sein. Für Ereignis-Listener ist er das DOM-Element, sodass this in Ihrem Code auf das DOM-Element verweist.

Um dieses Problem zu lösen, können Sie {{X0} verwenden } (Sie müssen die Browserunterstützung überprüfen, ob sie für Sie verwendbar ist, oder eine Polyfüllung verwenden, die auf der MDN-Seite zu finden ist.) Sie können jQuery.proxy oder erstellen Sie einen Abschluss und pflegen Sie den Kontext selbst.

0
t.niese 6 Dez. 2013 im 07:07